分块0pts求调
查看原帖
分块0pts求调
537934
litjohn楼主2024/1/27 20:38
#include<bits/stdc++.h>

using namespace std;
#define ll long long
ll n, q, m, a[100005], len, b[2005], s[2005], id[100005];

inline void add(ll l, ll r, ll k) {
    ll sid = id[l], eid = id[r];
    if (sid == eid) {
        for (ll i = l; i <= r; ++i) {
            a[i] += k;
            s[sid] += k;
            a[i] %= m;
            s[sid] %= m;
        }
        return;
    }
    for (ll i = l; id[i] == sid; ++i) {
        a[i] += k;
        s[sid] += k;
        a[i] %= m;
        s[sid] %= m;
    }
    for (ll i = r; id[i] == eid; --i) {
        a[i] += k;
        s[eid] += k;
        a[i] %= m;
        s[eid] %= m;
    }
    for (ll i = sid + 1; i < eid; ++i) {
        b[i] += k;
        s[i] += len * k;
        b[i] %= m;
        s[i] %= m;
    }
}

inline void multi(ll l, ll r, ll k) {
    ll sid = id[l], eid = id[r];
    if (sid == eid) {
        for (ll i = l; i <= r; ++i) {
            a[i] *= k;
            s[sid] += a[i] * (k - 1);
            a[i] %= m;
            s[sid] %= m;
        }
        return;
    }
    for (ll i = l; id[i] == sid; ++i) {
        a[i] *= k;
        s[sid] += a[i] * (k - 1);
        a[i] %= m;
        s[sid] %= m;
    }
    for (ll i = r; id[i] == eid; --i) {
        a[i] *= k;
        s[eid] += a[i] * (k - 1);
        a[i] %= m;
        s[eid] %= m;
    }
    for (ll i = sid + 1; i < eid; ++i) {
        b[i] += s[i] * (k - 1);
        s[i] *= k;
        b[i] %= m;
        s[i] %= m;
    }
}

inline ll query(ll l, ll r) {
    ll sid = id[l], eid = id[r], ans = 0;
    if (sid == eid) {
        for (ll i = l; i <= r; ++i) {
            ans += a[i] + b[sid];
            ans %= m;
        }
        return ans;
    }
    for (ll i = l; id[i] == sid; i++) {
        ans += a[i] + b[sid];
        ans %= m;
    }
    for (ll i = r; id[i] == eid; --i) {
        ans += a[i] + b[eid];
        ans %= m;
    }
    for (ll i = sid + 1; i < eid; i++) {
        ans += s[i];
        ans %= m;
    }
    return ans % m;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> q >> m;
    len = floor(sqrt(n));
    for (ll i = 1; i <= n; ++i) {
        cin >> a[i];
        id[i] = (i - 1) / len + 1;
        s[id[i]] += a[i];
    }
    for (ll i = 0; i < q; ++i) {
        ll op, l, r, k;
        cin >> op;
        if (op == 1) {
            cin >> l >> r >> k;
            multi(l, r, k % m);
        } else if (op == 2) {
            cin >> l >> r >> k;
            add(l, r, k);
        } else {
            cin >> l >> r;
            cout << query(l, r) << endl;
        }
    }
    return 0;
}

过了样例,但提交0分。

2024/1/27 20:38
加载中...