不过样例求调
查看原帖
不过样例求调
938933
Dtw_楼主2024/12/9 20:05
#include <bits/stdc++.h>

using namespace std;

#define fst ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

const int N = 2e5 + 10, P = 998244353;

int n, m, a[N];

struct Node
{
    int x, sz, add, mul;
    void solve(int u, int v)
    {
        add = (add * u % P + v) % P;
        mul = mul * u % P;
        x = (x * u % P + sz * v % P) % P;
    }
} tr[N << 2];

#define lson (rt << 1)
#define rson (rt << 1 | 1)
#define mid (l + r) / 2

void push_up(int rt) { tr[rt].x = tr[lson].x + tr[rson].x; }

void build(int rt, int l, int r)
{
    tr[rt] = {0, r - l + 1, 0, 1};
    if (l == r) return tr[rt] = {a[l] % P, 1, 0, 1}, void();
    build(lson, l, mid);
    build(rson, mid + 1, r);
    push_up(rt);
}

void push_down(int rt)
{
    int &u = tr[rt].mul, &v = tr[rt].add;
    tr[lson].solve(u, v);
    tr[rson].solve(u, v);
    u = 1, v = 0;
}

void update(int rt, int l, int r, int sp, int ep, int u, int v)
{
    if (sp <= l && r <= ep) return tr[rt].solve(u, v), void();
    push_down(rt);
    if (sp <= mid) update(lson, l, mid, sp, ep, u, v);
    if (ep > mid) update(rson, mid + 1, r, sp, ep, u, v);
    push_up(rt);
}

int qry(int rt, int l, int r, int p)
{
    if (l == r) return tr[rt].x;
    push_down(rt);
    if (p <= mid) return qry(lson, l, mid, p);
    return qry(rson, mid + 1, r, p);
}

int fpm(int a, int n)
{
    int res = 1;
    while (n)
    {
        if (n & 1) res = res * a % P;
        a = a * a % P;
        n /= 2;
    }
    return res;
}

int main()
{
    fst
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> a[i];
    build(1, 1, n);
    while (m--)
    {
        int l, r, x;
        cin >> l >> r >> x;
        int inv = fpm(r - l + 1, P - 2);
        update(1, 1, n, l, r, (r - l) * inv % P, x * inv % P);
    }
    for (int i = 1; i <= n; i++) cout << qry(1, 1, n, i) << " ";
    return 0;
}
2024/12/9 20:05
加载中...