为什么只有10pts,求大佬看看
  • 板块P5142 区间方差
  • 楼主FXJFXJ
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/27 14:59
  • 上次更新2024/3/27 17:32:28
查看原帖
为什么只有10pts,求大佬看看
918487
FXJFXJ楼主2024/3/27 14:59

为什么只能过一个点,没看出来问题呀

#include <bits/stdc++.h>
using ll = long long;
using namespace std;
#define int long long
#define lowbit(x) x&(-x)
const int mod = 1e9 + 7;
int n, m, tr1[100010], tr2[100010];
int qpow(int a) {
    int b = mod - 2, ans = 1;
    while (b) {
        if (b & 1)ans = (a * ans) % mod;
        a = (a * a) % mod;b >>= 1;
    }
    return ans;
}
void add(int tr[], int x, int k) {
    while (x <= n)tr[x] = (tr[x] + k) % mod, x += lowbit(x);
}
int query(int tr[], int x) {
    int ans = 0;
    while (x)ans = (ans + tr[x]) % mod, x -= lowbit(x);
    return ans % mod;
}
void solve() {
    cin >> n >> m;
    for (int i = 1;i <= n;i++) {
        int x;cin >> x;
        add(tr1, i, x % mod);
        add(tr2, i, (x * x) % mod);
    }
    while (m--) {
        int op, x, y;cin >> op >> x >> y;
        if (op == 1) {
            int p1 = (query(tr1, x) - query(tr1, x - 1)) % mod;
            int p2 = (query(tr2, x) - query(tr2, x - 1)) % mod;
            add(tr1, x, (y - p1) % mod);
            add(tr2, x, (y * y - p2) % mod);
        } else {
            int sum = (query(tr1, y) - query(tr1, x - 1)) % mod;
            int sqsum = (query(tr2, y) - query(tr2, x - 1)) % mod;
            int inv = qpow(y - x + 1);
            int ans1 = (sum * inv) % mod;
            int ans2 = (sqsum * inv) % mod;
            int ans = ans2 % mod - (ans1 * ans1) % mod;
            cout << (ans + mod) % mod << '\n';
        }
    }
}
signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int _ = 1;
    // cin >> _;
    while (_--)
        solve();
}
2024/3/27 14:59
加载中...