社区讨论
求助
P1471方差参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjkul0i
- 此快照首次捕获于
- 2025/11/04 04:13 4 个月前
- 此快照最后确认于
- 2025/11/04 04:13 4 个月前
已经调了很久了,始终无法通过样例的第三个,本地输出调试了一下,修改过后的
CPPquery1没有问题,但是针对query2出来的答案是6 18 16 4 9,也就是说前两个是不对的。# include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
double a[N];
#define ls(p) p << 1
#define rs(p) p << 1 | 1
struct node{
double pos,sum,tag;
}tr[N << 2];
void push_up(int p)
{
tr[p].pos = tr[ls(p)].pos+tr[rs(p)].pos;
tr[p].sum = tr[ls(p)].sum+tr[rs(p)].sum;
}
void build(int p,int l,int r)
{
tr[p].tag = 0;
if(l == r)
{
tr[p].pos = a[l]*a[l];
tr[p].sum = a[l];
return ;
}
int mid = (l+r) >> 1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
void push_down(int p,int l,int r)
{
int mid = (l+r) >> 1;
tr[ls(p)].sum += (mid-l+1)*tr[p].tag;
tr[rs(p)].sum += (r-mid)*tr[p].tag;
tr[ls(p)].tag += tr[p].tag;
tr[rs(p)].tag += tr[p].tag;
tr[ls(p)].pos += (2.0*tr[p].tag*tr[ls(p)].sum+(mid-l+1)*tr[p].tag*tr[p].tag);
tr[rs(p)].pos += (2.0*tr[p].tag*tr[rs(p)].sum+(r-mid)*tr[p].tag*tr[p].tag);
tr[p].tag = 0;
}
void update(int p,int nl,int nr,int l,int r,double k)
{
if(nl <= l && r <= nr)
{
tr[p].tag += k;
tr[p].sum += (r-l+1)*k;
tr[p].pos += 2.0*tr[p].sum*k+(r-l+1)*k*k;
return ;
}
if(tr[p].tag) push_down(p,l,r);
int mid = (l+r) >> 1;
if(nl <= mid) update(ls(p),nl,nr,l,mid,k);
if(nr > mid) update(rs(p),nl,nr,mid+1,r,k);
push_up(p);
}
double query1(int p,int nl,int nr,int l,int r)
{
if(nl <= l && r <= nr)
{
return tr[p].sum;
}
if(tr[p].tag) push_down(p,l,r);
int mid = (l+r) >> 1;
double res = 0;
if(nl <= mid) res += query1(ls(p),nl,nr,l,mid);
if(nr > mid) res += query1(rs(p),nl,nr,mid+1,r);
return res;
}
double query2(int p,int nl,int nr,int l,int r)
{
if(nl <= l && r <= nr)
{
return tr[p].pos;
}
if(tr[p].tag) push_down(p,l,r);
int mid = (l+r) >> 1;
double res = 0;
if(nl <= mid) res += query2(ls(p),nl,nr,l,mid);
if(nr > mid) res += query2(rs(p),nl,nr,mid+1,r);
return res;
}
int main (){
double n;
int m;
scanf("%lf%d",&n,&m);
for(int i = 1;i <= n;i++) scanf("%lf",&a[i]);
build(1,1,n);
// cout << "debug : ";
// cout << query1(1,1,n,1,n) << " ";
// cout << endl;
while(m--)
{
int op;
scanf("%d",&op);
if(op == 1)
{
int x,y;
double k;
scanf("%d%d%lf",&x,&y,&k);
update(1,x,y,1,n,k);
}
else if(op == 2)
{
double x,y;
scanf("%lf%lf",&x,&y);
printf("%.4f\n",query1(1,x,y,1,n)/(y-x+1.0));
}
else
{
double x,y;
scanf("%lf%lf",&x,&y);
printf("%.4f\n",(1.0*query2(1,x,y,1,n)/(y-x+1.0))-(1.0*(query1(1,x,y,1,n)/(y-x+1.0))*(1.0*query1(1,x,y,1,n)/(y-x+1.0))));
}
}
// for(int i = 1;i <= n;i++) cout << query2(1,i,i,1,n) << " ";
// cout << endl;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...