社区讨论
样例未过,全RE,蒟蒻求调(玄关)
P1471方差参与者 2已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @mhjaxbas
- 此快照首次捕获于
- 2025/11/03 23:35 4 个月前
- 此快照最后确认于
- 2025/11/03 23:35 4 个月前
CPP
#include<iostream>
#include<cstdio>
#include<cmath>
#include<utility>
using namespace std;
const int maxn=100005;
double a[maxn];
struct Tree
{
int l,r;
double lazy;
double sum1,sum2;
}tr[4*maxn];
void push_up(int id)
{
tr[id].sum1=tr[id*2].sum1+tr[id*2+1].sum1;
tr[id].sum2=tr[id*2].sum2+tr[id*2+1].sum2;
// cout << 1 << ' ';
}
void push_down(int id)
{
if(tr[id].lazy==0)
{
return ;
}
tr[id*2].sum2+=tr[id].lazy*tr[id].lazy*(tr[id*2].r-tr[id*2].l+1)+2*tr[id].lazy*tr[id*2].sum1;
tr[id*2+1].sum2+=tr[id].lazy*tr[id].lazy*(tr[id*2+1].r-tr[id*2+1].l+1)+2*tr[id].lazy*tr[id*2+1].sum1;
tr[id*2].sum1+=tr[id].lazy*(tr[id*2].r-tr[id*2].l+1);
tr[id*2+1].sum1+=tr[id].lazy*(tr[id*2+1].r-tr[id*2+1].l+1);
tr[id*2].lazy+=tr[id].lazy;
tr[id*2+1].lazy+=tr[id].lazy;
tr[id].lazy=0;
// cout << 2 << ' ';
}
void build(int id,int l,int r)
{
if(l==r)
{
tr[id].sum1=a[l];
tr[id].sum2=a[l]*a[l];
tr[id].l=l;
tr[id].r=r;
return ;
}
int mid=(l+r)>>1;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
push_up(id);
// cout << 3 << ' ';
}
void add(int id,int x,int y,double val)
{
if(x<tr[id].l&&tr[id].r<y)
{
tr[id].sum2+=(tr[id].r-tr[id].l+1)*val*val+2*val*tr[id].sum1;
tr[id].sum1+=(tr[id].r-tr[id].l+1)*val;
tr[id].lazy+=val;
return ;
}
push_down(id);
int mid=(tr[id].l+tr[id].r)>>1;
if(x<=mid)
{
add(id*2,x,y,val);
}
if(y>mid)
{
add(id*2+1,x,y,val);
}
// cout << 4 << ' ';
push_up(id);
}
double find1(int id,int x,int y)
{
if(x<=tr[id].l&&tr[id].r<=y)
{
return tr[id].sum1;
}
push_down(id);
int mid=(tr[id].l+tr[id].r)>>1;
double ans=0;
if(x<=mid)
{
ans+=find1(id*2,x,y);
}
if(y>mid)
{
ans+=find1(id*2+1,x,y);
}
return ans;
}
double find2(int id,int x,int y)
{
if(x<=tr[id].l&&tr[id].r<=y)
{
return tr[id].sum2;
}
push_down(id);
int mid=(tr[id].l+tr[id].r)>>1;
double ans=0;
if(x<=mid)
{
ans+=find2(id*2,x,y);
}
if(y>mid)
{
ans+=find2(id*2+1,x,y);
}
return ans;
}
int main()
{
int n,m;
cin >> n >> m;
for(int i=1;i<=n;i++)
{
cin >> a[i];
}
build(1,1,n);
int op;
int x,y;
double k;
for(int i=1;i<=m;i++)
{
cin >> op >> x >> y;
if(op==1)
{
cin >> k;
add(1,x,y,k);
}
else if(op==2)
{
printf("%.4lf\n",find1(1,x,y)/(y-x+1));
}
else
{
int t1=find1(1,x,y),t2=find2(1,x,y);
printf("%.4lf\n",(t2-2*t1/(y-x+1)*t1+t1)/(y-x+1));
}
}
return 0;
}
连续调了三个小时,还是没找到问题在哪。
回复
共 10 条回复,欢迎继续交流。
正在加载回复...