样例能过但0pts 树状数组 蒟蒻求调
  • 板块P1471 方差
  • 楼主Flechazo_07
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/21 18:16
  • 上次更新2024/7/21 19:39:16
查看原帖
样例能过但0pts 树状数组 蒟蒻求调
770011
Flechazo_07楼主2024/7/21 18:16
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
#define int long long
#define rep(x,y,z) for(int x = y;x<=z;x++)
int N,M;
double a[100005];
double b[100005];
double c[100005]={};
double c2[100005]={};
double lowbit(int x){	return x&(-x);}
void add(double x,double y){
	for(int i = x;i<=N;i+=lowbit(i)){
		c[i]+=y;
		c2[i]+=y*x;
	}
} 
double sum(double x){
	double res = 0;
	for(int i = x;i>0;i-=lowbit(i))
		res+=(x+1) * c[i] - c2[i];
	return res;
}
double sum2(double x){
	double res = 0;
	for(int i = x;i>0;i-=lowbit(i)) res+=c[i];
	return res;
}
int pp(int x){
	double k = x;
	return k*k;
}
void solve(){
	int op,x,y;
	cin >> op >> x >> y;
	if(op==1){
		double k;
		cin >> k;
		add(x,k);
		add(y+1,(-k));
	}else if(op==2){
		cout << fixed << setprecision(4) << (sum(y)-sum(x-1))/(y-x+1) << endl;
	}else{
		double xba = (sum(y)-sum(x-1))/(y-x+1);
		double res = 0;
		for(int i = x;i<=y;i++){
			res+=pp(sum2(i)-xba);
		}
		cout << fixed << setprecision(4) << res/(x+y-1) << endl; 
	}
}
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	cin >> N >> M;
	rep(x,1,N) cin >> a[x];
	rep(x,1,N) b[x]=a[x]-a[x-1];
	rep(x,1,N) add(x,b[x]);
	while(M--) solve(); 
	return 0;
}
2024/7/21 18:16
加载中...