萌新刚学线段树1ms求调
查看原帖
萌新刚学线段树1ms求调
974277
水星湖psgqwq楼主2024/4/24 21:23
#include<bits/stdc++.h>
#define int long long
#define lc (p<<1)
#define rc (p<<1|1)
#define mid ((l+r)>>1)
using namespace std;
const int mod = 1e9 + 7;
const int N = 1e5+5;
int n, m, op, x, y;
int a[N], s1[N<<2], s2[N<<2], t[N<<2];
int qpow(int a, int b){
    int res = 1;
    while(b){
        if(b & 1) res = res * a % mod;
        b >>= 1;
        a  = a * a % mod;
    }
    return res;
}
void pushup(int p){
    s1[p] = (s1[lc] + s1[rc]) % mod;
    s2[p] = (s2[lc] + s2[rc]) % mod;
}
void build(int p, int l, int r){
    if(l == r) return s1[p] = a[l], s2[p] = a[l] * a[l] % mod, void();
    build(lc, l, mid), build(rc, mid + 1, r);
    pushup(p);
}
void cal(int p, int l, int r, int x){
    int len = r - l + 1;
    s2[p] = (s2[p] + len * x % mod * x % mod + 2 * x % mod * s1[p] % mod) % mod;
    s1[p] = (s1[p] + len * x % mod) % mod;
    t[p] = (t[p] + x) % mod;
}
void pushdown(int p, int l, int r){
    if(t[p] != 0){
        cal(lc, l, mid, t[p]);
        cal(rc, mid + 1, r, t[p]);
        t[p] = 0;
    }
}
void add(int p, int l, int r, int L, int R, int x){
    if(r < L || R < l) return;
    if(L <= l && r <= R) return cal(p, l, r, x);
    pushdown(p, l, r);
    add(lc, l, mid, L, R, x), add(rc, mid + 1, r, L, R, x);
    pushup(p);
}
int query(int p, int l, int r, int L, int R, int *arr){
    if(r < L || R < l) return 0;
    if(L <= l && r <= R) return arr[p];
    pushdown(p, l, r);
    return (query(lc, l, mid, L, R, arr) + query(rc, mid + 1, r, L, R, arr)) % mod;
}
signed main() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        cin >> a[i];
    build(1, 1, n);
    while(m--){
        cin >> op >> x >> y;
        if(op == 1){
            add(1, 1, n, x, x, y - a[x]);
            a[x] = y;
        }
        if(op == 2){
            int inv = qpow(y - x + 1, mod - 2);
            int tmp = query(1, 1, n, x, y, s1) * inv % mod;
            int ans = (query(1, 1, n, x, y, s2) * inv % mod - tmp * tmp % mod + mod) % mod;
            cout << ans << endl;
        }
    }
    return 0;
}

50pts,输出负数,感觉取模问题

2024/4/24 21:23
加载中...