提出 #48476989


ソースコード 拡げる

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MOD = 998244353;

struct segTree{
    vector<ll> val, cnt, mult, sum;
    int size;

    void build(int x, int lx, int rx, vector<int>& a){
        if(rx - lx == 1){
            if(lx < (int)a.size()){
                cnt[x] = 1;
                val[x] = a[lx];
            }
            return;
        }
        int m = (lx + rx) / 2;
        build(2 * x + 1, lx, m, a);
        build(2 * x + 2, m, rx, a);
        cnt[x] = cnt[2 * x + 1] + cnt[2 * x + 2];
        val[x] = val[2 * x + 1] + val[2 * x + 2];
    }

    void init(vector<int>& a){
        int n = (int)a.size();
        size = 1;
        while(size < n) size *= 2;
        val.assign(2 * size, 0);
        cnt.assign(2 * size, 0);
        mult.assign(2 * size, 1);
        sum.assign(2 * size, 0);
        build(0, 0, size, a);
    }

    void push(int x){
        if(2 * x + 2 >= (int)val.size()) return;
        val[2 * x + 1] *= mult[x]; val[2 * x + 1] += sum[x] * cnt[2 * x + 1]; val[2 * x + 1] %= MOD;
        val[2 * x + 2] *= mult[x]; val[2 * x + 2] += sum[x] * cnt[2 * x + 2]; val[2 * x + 2] %= MOD;
        mult[2 * x + 1] *= mult[x]; mult[2 * x + 1] %= MOD; sum[2 * x + 1] *= mult[x]; sum[2 * x + 1] += sum[x]; sum[2 * x + 1] %= MOD;
        mult[2 * x + 2] *= mult[x]; mult[2 * x + 2] %= MOD; sum[2 * x + 2] *= mult[x]; sum[2 * x + 2] += sum[x]; sum[2 * x + 2] %= MOD;
        mult[x] = 1;
        sum[x] = 0;
    }

    void set(int l, int r, ll u, int type, int x, int lx, int rx){
        if(lx >= l && rx <= r){
            if(type == 1) {val[x] *= u; mult[x] *= u; sum[x] *= u;}
            else {val[x] += u * (rx - lx); sum[x] += u;}
            val[x] %= MOD; mult[x] %= MOD; sum[x] %= MOD;
            return;
        }else if(lx >= r || rx <= l) return;
        int m = (lx + rx) / 2;
        push(x);
        set(l, r, u, type, 2 * x + 1, lx, m);
        set(l, r, u, type, 2 * x + 2, m, rx);
        val[x] = val[2 * x + 1] + val[2 * x + 2];
        val[x] %= MOD;
    }

    void set(int l, int r, ll u, int type){ //Type = 1, multiplication. Type = 2, sum.
        set(l, r, u, type, 0, 0, size);
    }

    ll query(int l, int r, int x, int lx, int rx){
        if(lx >= l && rx <= r) return val[x];
        else if(lx >= r || rx <= l) return 0;
        int m = (lx + rx) / 2;
        push(x);
        ll s1 = query(l, r, 2 * x + 1, lx, m);
        ll s2 = query(l, r, 2 * x + 2, m, rx);
        return (s1 + s2) % MOD;
    }

    ll query(int l, int r){
        return query(l, r, 0, 0, size);
    }
};

ll binpow(ll a, ll b, int mod = MOD){
    if(!b) return 1;
    else if(b % 2 == 0){
        ll x = binpow(a, b / 2, mod);
        return (x * x) % mod;
    }else{
        ll x = binpow(a, b / 2, mod);
        return (((x * x) % mod) * a) % mod;
    }
}

ll inv(ll x, ll mod = MOD){
    x %= mod;
    return binpow(x, mod - 2, mod);
}

void solve(){
    int n, q; cin >> n >> q;
    vector<int> a(n);
    for(auto &i : a) cin >> i;
    segTree st; st.init(a);
    while(q--){
        int l, r, X; cin >> l >> r >> X; l--; r--;
        ll size = (r - l + 1);
        st.set(l, r + 1, ((size - 1) * inv(size)) % MOD, 1);
        st.set(l, r + 1, (X * inv(size)) % MOD, 2);
    }
    for(int i = 0; i < n; i++) cout << st.query(i, i + 1) << " ";
    cout << "\n";
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    solve();
}

提出情報

提出日時
問題 F - Random Update Query
ユーザ esomer
言語 C++ 20 (gcc 12.2)
得点 550
コード長 3537 Byte
結果 AC
実行時間 570 ms
メモリ 20384 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 550 / 550
結果
AC × 3
AC × 39
セット名 テストケース
Sample example0.txt, example1.txt, example2.txt
All 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, example0.txt, example1.txt, example2.txt
ケース名 結果 実行時間 メモリ
000.txt AC 100 ms 3456 KiB
001.txt AC 334 ms 20216 KiB
002.txt AC 336 ms 20144 KiB
003.txt AC 332 ms 20200 KiB
004.txt AC 391 ms 20212 KiB
005.txt AC 392 ms 20176 KiB
006.txt AC 394 ms 20228 KiB
007.txt AC 294 ms 20264 KiB
008.txt AC 296 ms 20144 KiB
009.txt AC 295 ms 20184 KiB
010.txt AC 505 ms 20212 KiB
011.txt AC 506 ms 20224 KiB
012.txt AC 506 ms 20380 KiB
013.txt AC 550 ms 20212 KiB
014.txt AC 558 ms 20384 KiB
015.txt AC 436 ms 11816 KiB
016.txt AC 177 ms 4108 KiB
017.txt AC 166 ms 20192 KiB
018.txt AC 251 ms 20200 KiB
019.txt AC 314 ms 7352 KiB
020.txt AC 247 ms 11732 KiB
021.txt AC 177 ms 5236 KiB
022.txt AC 133 ms 11768 KiB
023.txt AC 249 ms 11836 KiB
024.txt AC 180 ms 7272 KiB
025.txt AC 570 ms 20176 KiB
026.txt AC 567 ms 20248 KiB
027.txt AC 570 ms 20216 KiB
028.txt AC 560 ms 20176 KiB
029.txt AC 568 ms 20268 KiB
030.txt AC 561 ms 20180 KiB
031.txt AC 562 ms 20244 KiB
032.txt AC 561 ms 20204 KiB
033.txt AC 565 ms 20140 KiB
034.txt AC 565 ms 20272 KiB
035.txt AC 550 ms 20196 KiB
example0.txt AC 1 ms 3392 KiB
example1.txt AC 1 ms 3448 KiB
example2.txt AC 1 ms 3608 KiB