社区讨论
40WA求助
P1471方差参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m1j1sggb
- 此快照首次捕获于
- 2024/09/26 16:44 去年
- 此快照最后确认于
- 2024/09/26 20:15 去年
CPP
#include <bits/stdc++.h>
#define MAX 100001
#define int long long
using namespace std;
int n,m;
double a[MAX];
struct node{
int l,r;
double sum,powsum,tag;
}t[MAX<<2];
void build(int x, int l, int r) {
t[x].l=l,t[x].r=r;
if (t[x].l==t[x].r) {
t[x].sum=a[l];
t[x].powsum=a[l]*a[l];
return ;
}
int mid=(t[x].l+t[x].r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
t[x].sum=t[x<<1].sum+t[x<<1|1].sum;
t[x].powsum=t[x<<1].powsum+t[x<<1|1].powsum;
}
void lazy_work(int pos, double val) {
t[pos].tag+=val;
t[pos].powsum+=2.0*val*t[pos].sum+t[pos].tag*t[pos].tag*(t[pos].r-t[pos].l+1);
t[pos].sum+=val*(t[pos].r-t[pos].l+1);
}
void push_down(int x) {
if (!t[x].tag) return ;
lazy_work(x<<1,t[x].tag);
lazy_work(x<<1|1,t[x].tag);
t[x].tag=0.0;
}
void update(int x, int l, int r, double v) {
if (l<=t[x].l&&t[x].r<=r) {
t[x].tag+=v;
t[x].powsum+=2.0*v*t[x].sum+v*v*(t[x].r-t[x].l+1);
t[x].sum+=v*(1.0*(t[x].r-t[x].l+1));
return ;
}
int mid=(t[x].l+t[x].r)>>1;
push_down(x);
if (l<=mid) update(x<<1,l,r,v);
if (r>mid) update(x<<1|1,l,r,v);
t[x].sum=t[x<<1].sum+t[x<<1|1].sum;
t[x].powsum=t[x<<1].powsum+t[x<<1|1].powsum;
}
double query1(int x, int l, int r) {
if (l<=t[x].l&&t[x].r<=r) return t[x].sum;
push_down(x);
int mid=(t[x].l+t[x].r)>>1;
double ans=0.0;
if (l<=mid) ans+=query1(x<<1,l,r);
if (r>mid) ans+=query1(x<<1|1,l,r);
return ans;
}
double query2(int x, int l, int r) {
if (l<=t[x].l&&t[x].r<=r) return t[x].powsum;
push_down(x);
int mid=(t[x].l+t[x].r)>>1;
double ans=0.0;
if (l<=mid) ans+=query2(x<<1,l,r);
if (r>mid) ans+=query2(x<<1|1,l,r);
return ans;
}
signed main(){
cin >> n >> m;
for (int i=1;i<=n;i++) cin >> a[i];
build(1,1,n);
while(m--) {
int op,l,r;
double k;
cin >> op >> l >> r;
if (op==1) {
cin >> k;
update(1,l,r,k);
}
else if (op==2) {
cout << fixed << setprecision(4) << query1(1,l,r)*1.0/(r-l+1) << endl;
}
else {
double now=query1(1,l,r)*1.0/(r-l+1);
double ans=query2(1,l,r)*1.0/(r-l+1)-now*now;
cout << fixed << setprecision(4) << ans << endl;
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...