社区讨论

求助

P1471方差参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjkul0i
此快照首次捕获于
2025/11/04 04:13
4 个月前
此快照最后确认于
2025/11/04 04:13
4 个月前
查看原帖
已经调了很久了,始终无法通过样例的第三个,本地输出调试了一下,修改过后的query1没有问题,但是针对query2出来的答案是6 18 16 4 9,也就是说前两个是不对的。
CPP
# 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 条回复,欢迎继续交流。

正在加载回复...