样例未过求调
  • 板块P1471 方差
  • 楼主YangXiaopei
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/12/16 11:23
  • 上次更新2023/12/16 13:17:36
查看原帖
样例未过求调
785630
YangXiaopei楼主2023/12/16 11:23

样例输出:

3.0000
2.0000
2.0000

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, a[2000005], tr[2000005], tag[2000005], tr2[2000005], tag2[2000005];
void pushup(int cur){
	tr[cur] = tr[cur << 1] + tr[cur << 1 | 1];
	tr2[cur] = tr2[cur << 1] + tr2[cur << 1 | 1];
}
void lazytag(int cur, int lt, int rt, int val){
	tag[cur] += val;
	tr[cur] += (rt - lt + 1) * val;
}
void lazytag2(int cur, int lt, int rt, int val){
	tag2[cur << 1] += val;
	tr2[cur << 1] += tr[cur << 1] * val * 2 + (rt - lt + 1) * (val * val);
}
void pushdown(int cur, int lt, int rt){
	int mid = lt + rt >> 1;
	lazytag2(cur << 1, lt, mid, tag2[cur]);
	lazytag2(cur << 1 | 1, mid + 1, rt, tag2[cur]);
	lazytag(cur << 1, lt, mid, tag[cur]);
	lazytag(cur << 1 | 1, mid + 1, rt, tag[cur]);
	tag[cur] = 0;
	tag2[cur] = 0;
}
void build(int cur, int lt, int rt){
	if(lt == rt){
		tr[cur] = a[lt];
		tr2[cur] = a[lt] * a[rt];
		return;
	}
	int mid = lt + rt >> 1;
	build(cur << 1, lt, mid);
	build(cur << 1 | 1, mid + 1, rt);
	pushup(cur);
}
double query(int cur, int lt, int rt, int qx, int qy){
	if(lt > qy || rt < qx){
		return 0;
	}
	if(qx <= lt && rt <= qy){
		return tr[cur];
	}
	pushdown(cur, lt, rt);
	int mid = lt + rt >> 1;
	double x = query(cur << 1, lt, mid, qx, qy) + query(cur << 1 | 1, mid + 1, rt, qx, qy);
	pushup(cur);
	return x;
}
double query2(int cur, int lt, int rt, int qx, int qy){
	if(lt > qy || rt < qx){
		return 0;
	}
	if(qx <= lt && rt <= qy){
		return tr2[cur];
	}
	pushdown(cur, lt, rt);
	int mid = lt + rt >> 1;
	double x = query2(cur << 1, lt, mid, qx, qy) + query2(cur << 1 | 1, mid + 1, rt, qx, qy);
	pushup(cur);
	return x;
}
void update(int cur, int lt, int rt, int qx, int qy, int val){    
	if(lt > qy || rt < qx){
		return;
	}
	if(qx <= lt && rt <= qy){
		lazytag(cur, lt, rt, val);
		lazytag2(cur, lt, rt, val);
		return;
	}
	pushdown(cur, lt, rt);
	int mid = lt + rt >> 1;
	update(cur << 1, lt, mid, qx, qy, val);
	update(cur << 1 | 1, mid + 1, rt, qx, qy, val);
	pushup(cur);
}
signed main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
	}
	build(1, 1, n);
	while(m--){
		int op, x, y;
		cin >> op >> x >> y;
		if(op == 1){
			int val;
			cin >> val;;
			update(1, 1, n, x, y, val);
		}
		else if(op == 2){
			printf("%.4lf", 1.0 * query(1, 1, n, x, y) / (y - x + 1));
		}
		else{
			double b = 1.0 * query(1, 1, n, x, y) / (y - x + 1);
			printf("%.4lf", 1.0 * query2(1, 1, n, x, y) / (y - x + 1) - b * b);
		}
	}
	return 0;
}

根据题解第二篇思路写的,求调

2023/12/16 11:23
加载中...