QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#820544#4391. Slayers ComeSGColinAC ✓68ms21388kbC++203.4kb2024-12-18 21:46:232024-12-18 21:46:24

Judging History

This is the latest submission verdict.

  • [2024-12-18 21:46:24]
  • Judged
  • Verdict: AC
  • Time: 68ms
  • Memory: 21388kb
  • [2024-12-18 21:46:23]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

inline int rd() {
    int x = 0;
    bool f = 0;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) f |= (c == '-');
    for (; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
    return f ? -x : x; 
}

#define N 100007
#define fr first
#define sc second
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define min(x, y) ((x) < (y) ? (x) : (y))

int lg2[N], l[N][17], r[N][17], a[N], b[N];

vector<pii> s;

#define mod 998244353
#define ls (rt << 1)
#define rs (rt << 1 | 1)
#define mid ((l + r) >> 1)

int n, m, tot, c[N << 2], tag[N << 2];

inline void pushdown(int rt) {
    if (tag[rt] != 1) {
        c[ls] = 1ll * c[ls] * tag[rt] % mod;
        c[rs] = 1ll * c[rs] * tag[rt] % mod;
        tag[ls] = 1ll * tag[ls] * tag[rt] % mod;
        tag[rs] = 1ll * tag[rs] * tag[rt] % mod;
        tag[rt] = 1;
    }
}

inline int mo(int x) {return x >= mod ? x - mod : x;}

inline void pushup(int rt) {
    c[rt] = mo(c[ls] + c[rs]);
}

void build(int rt, int l, int r) {
    c[rt] = 0; tag[rt] = 1;
    if (l == r) return;
    build(ls, l, mid);
    build(rs, mid + 1, r);
}

void add(int rt, int l, int r, int p, int x) {
    if (l == r) {c[rt] = mo(c[rt] + x); return;}
    pushdown(rt);
    p <= mid ? add(ls, l, mid, p, x) : add(rs, mid + 1, r, p, x); 
    pushup(rt);
}

void mul(int rt, int l, int r, int L, int R) {
    if (L <= l && r <= R) {
        tag[rt] = mo(tag[rt] + tag[rt]);
        c[rt] = mo(c[rt] + c[rt]); return;
    }
    pushdown(rt);
    if (L <= mid) mul(ls, l, mid, L, R);
    if (R > mid) mul(rs, mid + 1, r, L, R);
    pushup(rt);
}

int sum(int rt, int l, int r, int L, int R) {
    if (L <= l && r <= R) return c[rt];
    pushdown(rt);
    int ans = 0;
    if (L <= mid) ans = mo(ans + sum(ls, l, mid, L, R));
    if (R > mid) ans = mo(ans + sum(rs, mid + 1, r, L, R));
    return ans;
}

inline void work() {
    s.clear();
    n = rd(); m = rd();
    int t = lg2[n];
    build(1, 0, n);
    for (int i = 1; i <= n; ++i) {
        c[i] = 0;
        for (int j = 0; j <= t; ++j) l[i][j] = r[i][j] = -2e9;
    }
    for (int i = 1; i <= n; ++i) a[i] = rd(), b[i] = rd();
    for (int i = 2; i <= n; ++i) l[i][0] = a[i] - b[i - 1]; 
    for (int i = 1; i < n; ++i) r[i][0] = a[i] - b[i + 1];
    for (int j = 1; j <= t; ++j) {
        for (int i = (1 << j) + 1; i <= n; ++i)
            l[i][j] = min(l[i][j - 1], l[i - (1 << (j - 1))][j - 1]);
        for (int i = 1; i + (1 << j) <= n; ++i)
            r[i][j] = min(r[i][j - 1], r[i + (1 << (j - 1))][j - 1]);
    }
    for (int i = 1; i <= m; ++i) {
        int p = rd(), lw = rd(), rw = rd();
        int L = p, R = p;
        for (int j = t; ~j; --j) {
            if (lw <= l[L][j]) L -= (1 << j);
            if (rw <= r[R][j]) R += (1 << j);
        }
        s.pb(mp(L, R));
    }
    sort(s.begin(), s.end(), [&](pii a, pii b){return a.sc < b.sc;});
    add(1, 0, n, 0, 1);
    for (auto i : s) {
        int L = i.fr, R = i.sc;
        if (L > 1) mul(1, 0, n, 0, L - 2);
        int w = sum(1, 0, n, L - 1, R);
        add(1, 0, n, R, w);
    }
    printf("%d\n", sum(1, 0, n, n, n));
}

int main() {
    for (int i = 1; (1 << i) < N; ++i) ++lg2[1 << i];
    for (int i = 1; i < N; ++i) lg2[i] += lg2[i - 1];
    for (int t = rd(); t; --t) work();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 68ms
memory: 21388kb

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:

790989612
671747997
0
437770386
293758108
417733173
876589319
754905430
511705067
4194304
908866994
0
362293000
268315788
810816358
587847598
378811885
673322235
478150607
897151370
331537435
714057465
262017639
527438203
922745986
484494985
318652554
331818541
767356752
601981094
34519446
0
5190730...

result:

ok 100 lines