线段树10pts求助!
查看原帖
线段树10pts求助!
285414
Swiftie_wyc22楼主2023/2/1 15:23
#include <bits/stdc++.h>

using namespace std;
#define ll long long
#define ls id<<1
#define rs id<<1|1
#define N 100005
ll qpow(ll a, ll b, ll p) {
	ll res = 1;
	while (b > 0) {
		if (b & 1) {
			res = res * a % p;
		}
		a = a * a % p;
		b >>= 1;
	}
	return res;
}
const ll mod = 1000000007;
int n, m;
ll b[N];
struct Tree{
	int left, right;
	ll sum, powersum;
};
Tree tree[N * 4];
inline void pushup(int id) {
	tree[id].sum = (tree[ls].sum + tree[rs].sum) % mod;
	tree[id].powersum = (tree[ls].powersum + tree[rs].powersum) % mod;
}

void build(int id, int l, int r) {
	tree[id].left = l;
	tree[id].right = r;
	tree[id].sum = tree[id].powersum = 0;
	if (l == r) {
		tree[id].sum = b[l];
		tree[id].powersum = (b[l] * b[l]) % mod;
		return;
	}
	int mid = l + r >> 1;
	build(ls, l, mid);
	build(rs, mid + 1, r);
	pushup(id);
}
void modify(int id, int pos, int val) {
	if (tree[id].left > pos || tree[id].right < pos) {
		return;
	}
	if (tree[id].left >= pos && tree[id].right <= pos) {
		tree[id].sum = val;
		tree[id].powersum = val * val % mod;
		return;
	}
	modify(ls, pos, val);
	modify(rs, pos, val);
	pushup(id);	
}

ll querysum(int id, int l, int r) {
	if (tree[id].left > r || tree[id].right < l) return 0;
	if (tree[id].left >= l &&tree[id].right <= r) {
		return tree[id].sum % mod;
	}
	return (querysum(ls, l, r) + querysum(rs, l, r)) % mod;
}
ll querypsum(int id, int l, int r) {
	if (tree[id].left > r || tree[id].right < l) return 0;
	if (tree[id].left >= l &&tree[id].right <= r) {
		return tree[id].powersum % mod;
	}
	return (querypsum(ls, l, r) + querypsum(rs, l, r)) % mod;
}

int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &b[i]);
	}
	build(1, 1, n);
	while (m--) {
		int c, x;
		ll y;
		scanf("%d%d%lld", &c, &x, &y);
		if (c == 1) {
			modify(1, x, y);
		} else {
			ll inv = qpow(y - x + 1, mod - 2, mod);
			ll sm = querysum(1, x, y), pwsm = querypsum(1, x, y);
			ll a = sm * inv % mod;
			ll v = (pwsm - 2ll * a % mod * sm % mod + a * a % mod * (y - x + 1) % mod) * inv % mod;
			printf("%lld\n", v);
		}
	}
	return 0;
}

就过了第一组样例!求助啊谢谢!

2023/2/1 15:23
加载中...