QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#48740 | #4391. Slayers Come | lqhsmash | WA | 136ms | 43536kb | C++20 | 5.5kb | 2022-09-15 14:25:48 | 2022-09-15 14:25:50 |
Judging History
answer
#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 50;
const int MOD = 998244353;
int T, n, m, a[N], b[N], c[N];
struct node {
int l, r, v, lazy;
node () { l = r = v = -inf; }
}t[N << 2];
struct line { int l, r; } e[N];
bool operator < (line x, line y) {
return x.r < y.r;
}
struct Tree {
node t[N << 2];
#define ls (x << 1)
#define rs (x << 1 | 1)
void pushup (int x) {
t[x].v = max (t[ls].v, t[rs].v);
}
void build (int l, int r, int* a, int x = 1) {
t[x].l = l, t[x].r = r;
if (l == r) {
t[x].v = a[l];
return ;
}
int mid = (l + r) >> 1;
build (l, mid, a, ls), build (mid + 1, r, a, rs);
pushup (x);
}
int ask_R (int l, int r, int v, int x = 1) {
int mid = (t[x].l + t[x].r) >> 1;
if (l <= t[x].l && t[x].r <= r) {
if (t[x].l == t[x].r)
return t[x].v < v ? t[x].l : n + 1;
if (t[ls].v < v)
return ask_L (l, r, v, ls);
else if (t[rs].v < v)
return ask_L (l, r, v, rs);
else return n + 1;
}
int p1 = n + 1, p2 = n + 1;
if (l <= mid) p1 = ask_R (l, r, v, ls);
if (r > mid) p2 = ask_R (l, r, v, rs);
return min (p1, p2);
}
int ask_L (int l, int r, int v, int x = 1) {
int mid = (t[x].l + t[x].r) >> 1;
if (l <= t[x].l && t[x].r <= r) {
if (t[x].l == t[x].r)
return t[x].v < v ? t[x].l : 0;
if (t[rs].v < v)
return ask_L (l, r, v, rs);
else if (t[ls].v < v)
return ask_L (l, r, v, ls);
else return 0;
}
int p1 = 0, p2 = 0;
if (l <= mid) p1 = ask_L (l, r, v, ls);
if (r > mid) p2 = ask_L (l, r, v, rs);
return max (p1, p2);
}
void print (int x = 1) {
if (t[x].l == t[x].r) {
cerr << t[x].v << ' ';
return ;
}
print (ls), print (rs);
}
}t1, t2;
void pushup (int x) {
t[x].v = (t[ls].v + t[rs].v) % MOD;
}
void pushdown (int x) {
if (t[x].lazy != 1) {
t[ls].lazy = t[ls].lazy * (ll)t[x].lazy % MOD;
t[rs].lazy = t[rs].lazy * (ll)t[x].lazy % MOD;
t[ls].v = t[ls].v * (ll)t[x].lazy % MOD;
t[rs].v = t[rs].v * (ll)t[x].lazy % MOD;
t[x].lazy = 1;
}
}
void build (int l, int r, int x = 1) {
t[x].l = l, t[x].r = r, t[x].lazy = 1;
if (l == r) {
t[x].v = 0;
return ;
}
int mid = (l + r) >> 1;
build (l, mid, ls), build (mid + 1, r, rs);
pushup (x);
}
void update (int p, int v, int x = 1) {
if (t[x].l == t[x].r) {
t[x].v = (t[x].v + v) % MOD;
return ;
}
pushdown (x);
int mid = (t[x].l + t[x].r) >> 1;
if (p <= mid) update (p, v, ls);
if (p > mid) update (p, v, rs);
pushup (x);
}
void update2 (int l, int r, int x = 1) {
if (l <= t[x].l && t[x].r <= r) {
t[x].v = t[x].v * 2 % MOD;
t[x].lazy = t[x].lazy * 2 % MOD;
return ;
}
pushdown (x);
int mid = (t[x].l + t[x].r) >> 1;
if (l <= mid) update2 (l, r, ls);
if (r > mid) update2 (l, r, rs);
pushup (x);
}
int query (int l, int r, int x = 1) {
if (l <= t[x].l && t[x].r <= r)
return t[x].v;
pushdown (x);
int mid = (t[x].l + t[x].r) >> 1, res = 0;
if (l <= mid) res = (res + query (l, r, ls)) % MOD;
if (r > mid) res = (res + query (l, r, rs)) % MOD;
return res;
}
int main() {
#ifdef LOCAL
clock_t c1 = clock();
freopen("in.in", "r", stdin);
freopen("out.out", "w", stdout);
#endif
// =================================================
scanf ("%d", &T);
while (T --) {
scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; i ++)
scanf ("%d%d", &a[i], &b[i]);
for (int i = 2; i <= n; i ++)
c[i] = a[i - 1] - b[i];
t1.build (2, n, c);
// for (int i = 1; i <= n; i ++)
// cerr << c[i] << ' ';
// cerr << endl;
for (int i = 1; i < n; i ++)
c[i] = a[i + 1] - b[i];
t2.build (1, n - 1, c);
// for (int i = 1; i <= n; i ++)
// cerr << c[i] << ' ';
// cerr << endl;
// t1.print ();
// cerr << endl;
// t2.print ();
// cerr << endl;
// cerr << "res = " << t1.ask_R (3, n, -2) << endl;
for (int i = 1; i <= m; i ++) {
int x, L, R;
scanf ("%d%d%d", &x, &L, &R);
if (x == 1) e[i] = {1, max (x, t1.ask_R (x + 1, n, R) - 1)};
else if (x == n) e[i] = {min (x, t2.ask_L (1, x - 1, L) + 1), n};
else e[i] = {min (x, t2.ask_L (1, x - 1, L) + 1), max (x, t1.ask_R (x + 1, n, R) - 1)};
// cerr << e[i].l << ' ' << e[i].r << endl;
}
sort (e + 1, e + 1 + m);
build (0, n);
update (0, 1);
for (int i = 1; i <= m; i ++) {
int l = e[i].l, r = e[i].r;
update (r, query (l - 1, r));
if (l - 2 >= 0) update2 (0, l - 2);
}
printf("%d\n", query (n, n));
}
// =================================================
#ifdef LOCAL
cerr << "Time Used = " << clock() - c1 << "ms" << endl;
#endif
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 136ms
memory: 43536kb
input:
100 94361 94314 33869598 5185471 618720133 505036749 409602893 40833389 73363932 853969687 132417645 381351032 465347847 676007624 210787499 3355224 991034578 503557482 118882583 12886598 821718576 953581962 979222818 458179522 17341621 962353208 11732262 180321038 947467293 869555337 27442910 91111...
output:
214247660 327862035 8 407592319 233169775 838182456 713596737 595520677 348520414 16775680 717197614 6 276754934 268318848 84176811 345767814 505666965 984568257 749731772 560156050 740876590 714057465 777413472 116958234 126875495 119767615 985520457 79501958 647649911 601981094 203664593 62464 952...
result:
wrong answer 1st lines differ - expected: '790989612', found: '214247660'