10 pts 实在不知道有啥问题,求调 qwq
查看原帖
10 pts 实在不知道有啥问题,求调 qwq
833737
Lyw_and_Segment_Tree楼主2025/7/24 09:52

rt,10 pts,柿子推对了样例过了,取模也挺到位的,不知道为啥只有 10 pts,求好心人帮助。

code :

#include <bits/stdc++.h>
#define ll long long
#define db double
#define pll pair<ll, ll>
#define vec vector
#define pb push_back
#define endl "\n"

#define ls (u << 1)
#define rs (u << 1 | 1)

const ll mod = 1e9 + 7;

using namespace std;

ll n, m, q, a[200005]; // string s;

ll opt, l, r, ans = 0;

struct segment {
	ll l, r, sum, sum2;
} w[800005] ;

void pushup(ll u) {
	w[u].sum = (w[ls].sum + w[rs].sum) % mod, w[u].sum %= mod;
	w[u].sum2 = (w[ls].sum2 + w[rs].sum2) % mod, w[u].sum2 %= mod;
}


void build(ll u, ll l, ll r) {
	w[u].l = l, w[u].r = r;
	
	if (l == r) {
		w[u].sum = (a[l]) % mod, w[u].sum2 = (a[l] * a[l]) % mod;
		
		return ;
	}
	
	ll md = l + ((r - l) >> 1);
	
	build(ls, l, md), build(rs, md + 1, r);
}

ll qsum(ll u, ll l, ll r) {
	if (l <= w[u].l && w[u].r <= r) {
		return w[u].sum % mod;
	}
	
	ll md = w[u].l + ((w[u].r - w[u].l) >> 1), res = 0;
	
	if (l <= md) res += (qsum(ls, l, r) % mod), res %= mod;
	
	if (r > md) res += (qsum(rs, l, r) % mod), res %= mod;
	
	return res % mod;
}

ll qsum2(ll u, ll l, ll r) {
	if (l <= w[u].l && w[u].r <= r) {
		return w[u].sum2 % mod;
	}
	
	ll md = w[u].l + ((w[u].r - w[u].l) >> 1), res = 0;
	
	if (l <= md) res += (qsum2(ls, l, r) % mod), res %= mod;
	
	if (r > md) res += (qsum2(rs, l, r) % mod), res %= mod;
	
	return res % mod;
}

void modify(ll u, ll x, ll y) {
	if (w[u].l == w[u].r && w[u].l == x) {
		w[u].sum = (y % mod), w[u].sum2 = ((y * y) % mod); return ;
	}
	
	ll md = w[u].l + ((w[u].r - w[u].l) >> 1);
	
	if (x <= md) modify(ls, x, y);
	
	else modify(rs, x, y);
	
	pushup(u);
}

ll qpow(ll a, ll b) {
	ll res = 1;
	
	while (b) {
		if (b & 1) {
			res = res * a % mod, res %= mod;
		}
		
		a = (a * a % mod) % mod, b >>= 1;
	}
	
	return (res % mod);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	
	ll i, j, k, x, y, z, res, now = 0;
	
	cin >> n >> m;
	
	for (i = 1; i <= n; i++) cin >> a[i], a[i] %= mod;
	
	build(1, 1, n);
	
	while (m--) {
		cin >> opt >> x >> y;
		
		if (opt == 1) {
			modify(1, x, (y % mod));
		} else {
			ll ny = qpow((y - x + 1), mod - 2) % mod;
			
			ll pj = ((qsum(1, x, y) % mod) * (ny % mod)) % mod;
			
			ll p1 = qsum2(1, x, y) % mod, p2 = ((y - x + 1) * pj) % mod * pj % mod;
			
			ll res = ((p1 % mod - ((2 * (pj * qsum(1, x, y) % mod) % mod) % mod) + mod) % mod + p2 % mod + mod) % mod;
			
			(res *= ny) %= mod, res %= mod;
			
			cout << res << endl;
		}
	}
	
	return 0;
} 
2025/7/24 09:52
加载中...