不是为什么样例都跑不了。。感觉这个查询没问题。。但怎么死循环了啊
  • 板块P5142 区间方差
  • 楼主TsH_GD
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/4/30 22:43
  • 上次更新2024/5/1 10:51:54
查看原帖
不是为什么样例都跑不了。。感觉这个查询没问题。。但怎么死循环了啊
559502
TsH_GD楼主2024/4/30 22:43
/*
  {方差}^2 = 1 / n  ∑(1 - n)n_i - {平均数}^2
 */

#include<bits/stdc++.h>

#define int long long

using namespace std;

const int mod = 1e9 + 7;
const int N = 1e5 + 10;

int qpow (int b,int p = mod - 2,int m = mod) {
	b %= m;
	int s = 1 % m;
	for (; p; p >> 1, b = b * b % m) {
		if (p & 1) s = s * b % m;
	}
	return s;
}

int n, m;
int b[N];

struct Node {
	int l, r, pans, ans;
}tr[N * 4];

void change(int p, int k, int v){
	if(tr[p].l > k || tr[p].r < k) return ;
	if(tr[p].l == tr[p].r){
		tr[p].pans = v * v % mod;
		tr[p].ans = v % mod;
		return ;
	}
	change(p << 1, k, v);
	change(p << 1 | 1, k ,v);
	tr[p].pans = tr[p << 1].pans + tr[p << 1 | 1].pans;
	tr[p].pans %= mod;
	tr[p].ans = tr[p << 1].ans + tr[p << 1 | 1].ans;
	tr[p].ans %= mod;
}

void build (int p, int l, int r){
	tr[p] = {l, r, 0, 0};
	if (l == r) {
		tr[p].ans = b[l] % mod;
		tr[p].pans = b[l] * b[l] % mod;
		return ;
	}
	int mid = l + r >> 1 ;
	build(p << 1, l, mid);
	build(p << 1 | 1, mid + 1, r);
	tr[p].ans = tr[p << 1].ans + tr[p << 1 | 1].ans;
	tr[p].ans %= mod;
	tr[p].pans = tr[p << 1].pans + tr[p << 1 | 1].pans;
	tr[p].pans %= mod;
}

int query1(int p, int l, int r){
	if(tr[p].l >= l && tr[p].r <= r) return tr[p].ans % mod;
	if(tr[p].l > r || tr[p].r < l) return 0;
	return (query1(p << 1, l, r) + query1(p << 1 | 1, l, r)) % mod;
}

int query2(int p, int l, int r){
	if(tr[p].l >= l && tr[p].r <= r) return tr[p].pans % mod;
	if(tr[p].l > r || tr[p].r < l) return 0;
	return (query2(p << 1, l, r) + query2(p << 1 | 1, l, r)) % mod;
}

signed main() {
	scanf("%lld %lld",&n, &m);
	for (int i = 1 ; i <= n ; ++ i)  scanf("%lld",&b[i]);
	build(1, 1, n);
	for (int i = 1 ; i <= m ; ++ i){
		int op, x, y;
		scanf("%lld %lld %lld",&op, &x, &y);
		if (op == 1) change(1, x, y); 
		if (op == 2){
			int ans1 = query1(1, x, y);
			int ans2 = query2(1, x, y);
			int inv = qpow(y - x + 1);
			int ave = ans1 * inv % mod;
			int ans = ans2 * inv %mod - ave * ave % mod;
			ans = (ans % mod + mod) % mod;
			printf("%lld\n",ans);
		}
	}
}
2024/4/30 22:43
加载中...