AC一个点9个点RE
查看原帖
AC一个点9个点RE
799877
AK_heaven楼主2023/12/15 09:42

代码如下:

#include <bits/stdc++.h>
#define ls (p<<1)
#define rs (p<<1|1)
#define sqr(a) (a*a%mod)
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
const int mod = 1e9 + 7;
ll n, m;
struct Seg {
	ll l, r, sum, psum;
}tr[maxn<<2];

ll qpow(int a) {
	ll ans = 1, base = a;
	ll x = mod-2;
	while(x) {
		if(x & 1) ans = (ans * base) % mod;
		base = (base*base)%mod; x >>= 1;
	}
	return ans;
}
ll a[maxn];
void pushup(int p) {
	tr[p].psum = (tr[ls].psum + tr[rs].psum)%mod;
	tr[p].sum = (tr[ls].sum + tr[rs].sum)%mod;
}

void build(int p, int l, int r) {
	tr[p].l = l, tr[p].r = r;
	if(l == r) {
		tr[p].psum = sqr(a[l]);
		tr[p].sum = a[l];
		return ;
	}
	int mid = (l+r)/2;
	build(ls, l, mid);
	build(rs, mid+1, r);
	pushup(p);
}

void update(int p, int x, ll k) {
	if(tr[p].l == x && tr[p].r == x) {
		tr[p].sum = k;
		tr[p].psum = sqr(k);
		return ;
	}
	int mid = (tr[p].l + tr[p].r)/2;
	if(x <= mid) update(ls, x, k);
	else update(rs, x, k);
	pushup(p);
}

ll q1(int p, int x, int y) {
	if(x <= tr[p].l && tr[p].r <= y) {
		return tr[p].sum;
	}
	int mid = (tr[p].l + tr[p].r);
	int s = 0;
	if(x <= mid) s += q1(ls, x, y);
	if(y > mid) s += q1(rs, x, y);
	return s%mod;
}

ll q2(int p, int x, int y) {
	if(x <= tr[p].l && tr[p].r <= y) {
		return tr[p].psum;
	}
	int mid = (tr[p].l + tr[p].r);
	int s = 0;
	if(x <= mid) s += q2(ls, x, y);
	if(y > mid) s += q2(rs, x, y);
	return s%mod;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
	  cin >> a[i];
	build(1, 1, n);
	ll op, x, y;
	while(m--) {
		cin >> op >> x >> y;
		if(op == 1) {
			update(1, x, y);
		}
		else {
			ll s1 = q1(1, x, y);
			ll s2 = q2(1, x, y);
			ll inv = qpow(y-x+1);
			ll ave = s1*inv%mod;
			ll d = s2*inv%mod - ave*ave%mod;
			d = (d%mod+mod)%mod;
			cout << d << '\n';
		}
	}
	return 0;
}
2023/12/15 09:42
加载中...