本地AC,交上去全输出 0?
查看原帖
本地AC,交上去全输出 0?
354310
Tnuzy_plzro楼主2023/3/18 00:28

rt,救救蒟蒻吧(qwq

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, a, b) for (int i = a; i <= b; i++)
const int N = 2e5 + 10, mod = 998244353;
int n, m;
struct Q {
    int l, r, b, t, d, oper;
} q[N];
int ls[N], rs[N], x[N], y[N], l[N], r[N], b[N], t[N];
int w[N], cnt;
struct tag {
    int a=1, b=0;
    tag(int _a = 1, int _b = 0) {
        a = _a;
        b = _b;
    }
    int apply(int x) { return (a * x + b )%mod; }
    tag comb(tag& y) { return tag(a * y.a % mod, (b * y.a + y.b)%mod ); }
    bool emp() { return a == 1 && b == 0; }
};
tag I = tag(1, 0);
tag times(int x) { return tag(x, 0); }
tag adds(int x) { return tag(1, x); }
void gmx(int& x, int y) { x = max(x, y); }
void gmi(int& x, int y) { x = min(x, y); }
tag tg[N];
void apply(int x, tag T) {
    w[x] = T.apply(w[x]);
    tg[x] = tg[x].comb(T);
}
void pushdown(int x) {
    if (tg[x].emp())
        return;
    if (ls[x])
        apply(ls[x], tg[x]);
    if (rs[x])
        apply(rs[x], tg[x]);
    tg[x] = I;
}
void pushup(int x) {
    if (l > r)
        return;
    ::l[x] = ::r[x] = ::x[x];
    ::b[x] = ::t[x] = ::y[x];
    if (ls[x]) {
        gmi(::l[x], ::l[ls[x]]);
        gmx(::r[x], ::r[ls[x]]);
        gmi(::b[x], ::b[ls[x]]);
        gmx(::t[x], ::t[ls[x]]);
    }
    if (rs[x]) {
        gmi(::l[x], ::l[rs[x]]);
        gmx(::r[x], ::r[rs[x]]);
        gmi(::b[x], ::b[rs[x]]);
        gmx(::t[x], ::t[rs[x]]);
    }
}
struct pt {
    int x, y, id;
} P[N];
int ot;
int id[N];
bool operator<(pt a, pt b) {
    if (ot) {
        return a.x < b.x;
    } else {
        return a.y < b.y;
    }
}
int top=0;
void build(int& x, int l, int r) {
    if (l > r)
        return;
    x = ++cnt;
    int mid = l + r >> 1;
    ot = rand() % 2;
    nth_element(P + l, P + mid, P + r + 1);
    ::x[x] = P[mid].x;
    ::y[x] = P[mid].y;
    ::id[x] = P[mid].id;
    build(ls[x], l, mid - 1);
    build(rs[x], mid + 1, r);
    pushup(x);
}
void edit(int& x, int l, int r, int b, int t, tag T) {
    if (l <= ::l[x] && ::r[x] <= r && b <= ::b[x] && ::t[x] <= t) {
        apply(x, T);
        return;
    }
    if (::l[x] > r || ::r[x] < l || ::b[x] > t || ::t[x] < b) {
        return;
    }
    if (l <= ::x[x] && ::x[x] <= r && b <= ::y[x] && ::y[x] <= t) {
        w[x] = T.apply(w[x]);
    }
    pushdown(x);
    edit(ls[x], l, r, b, t, T);
    edit(rs[x], l, r, b, t, T);
    pushup(x);
}
int answ[N];
void print(int x) {
    if (!x)
        return;
    pushdown(x);
    print(ls[x]);
    answ[id[x]] = ::w[x];
    print(rs[x]);
}
int tot=0, lne[N];
int rt=0;
signed main() {
	srand((unsigned)time(0));
    ios::sync_with_stdio(0);
    cin >> n >> m;
    int op, l, r, d, p;
    rep(i, 1, m) {
        cin >> op;
        if (op == 1) {
            cin >> l >> r >> d;
            q[++tot] = { l, r, i, N + 10, d, 0 };
            lne[i] = tot;
        } else if (op == 2) {
            cin >> l >> r >> d;
            q[++tot] = { l, r, i, N + 10, d, 1 };
            lne[i] = tot;
        } else if (op == 3) {
            cin >> p;
            P[++top] = { p, i, top };
        } else {
            cin >> p;
            q[lne[p]].t = i;
        }
    }
    build(rt, 1, top);
    rep(i, 1, tot) {
        if (q[i].oper == 0) {
            edit(rt, q[i].l, q[i].r, q[i].b, q[i].t, adds(q[i].d%mod));
        } else {
            edit(rt, q[i].l, q[i].r, q[i].b, q[i].t, times(q[i].d%mod));
        }
    }
    print(rt);
    rep(i, 1, top) cout << answ[i] << '\n';
}
2023/3/18 00:28
加载中...