求助,有没有大佬帮蒟蒻忙debug的
查看原帖
求助,有没有大佬帮蒟蒻忙debug的
388414
comcopy楼主2022/7/18 08:08

对拍看了半天都找不到自己错在哪儿,是不是没救了?

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MXN=100000;

struct tre{
    int ls;
    int sum[6];
}f[((MXN)<<2)+10];

int sum1,sum2,sum3;

void build(int l,int r,int c)
{
    if(l==r)
        {
            f[c].sum[4]=l*l;
            f[c].sum[5]=l;
            return;
        }
    int mid=((r-l)>>1)+l;
    build(l,mid,c*2);
    build(mid+1,r,c*2+1);
    f[c].sum[4]=f[c*2].sum[4]+f[c*2+1].sum[4];
    f[c].sum[5]=f[c*2].sum[5]+f[c*2+1].sum[5];
    return;
}

void xiachuan(int v,int now,int l,int r)
{
            f[now].sum[1]+=(r-l+1)*v;
            f[now].sum[2]+=v*f[now].sum[5];
            f[now].sum[3]+=v*f[now].sum[4];
            f[now].ls+=v;
        return;
}

void chan(int nl,int nr,int l,int r,int now,int v)
{
    if(nl>=l && nr<=r)
        {
            f[now].sum[1]+=(r-l+1)*v;
            f[now].sum[2]+=v*f[now].sum[5];
            f[now].sum[3]+=v*f[now].sum[4];
            f[now].ls+=v;
            return;
        }
    if(nl==nr) return;
    int mid=((nr-nl)>>1)+nl;
    if(f[now].ls)
    {
        xiachuan(f[now].ls,now*2,l,mid);
        xiachuan(f[now].ls,now*2+1,mid+1,r);
        f[now].ls=0;
    }
    if(mid>=l) chan(nl,mid,l,r,now*2,v);
    if(mid<r) chan(mid+1,nr,l,r,now*2+1,v);
    f[now].sum[1]=f[now*2].sum[1]+f[now*2+1].sum[1];
    f[now].sum[2]=f[now*2].sum[2]+f[now*2+1].sum[2];
    f[now].sum[3]=f[now*2].sum[3]+f[now*2+1].sum[3];
    return;
}



void fd(int nl,int nr,int l,int r,int now)
{
    if(nl>=l && nr<=r)
        {
            sum1+=f[now].sum[1];
            sum2+=f[now].sum[2];
            sum3+=f[now].sum[3];
            return;
        }
    int mid=((nr-nl)>>1)+nl;
    xiachuan(f[now].ls,now*2,nl,mid);
    xiachuan(f[now].ls,now*2+1,mid+1,nr);
    f[now].ls=0;
    if(mid>=l) fd(nl,mid,l,r,now*2);
    if(mid<r) fd(mid+1,nr,l,r,now*2+1);
    
    return;
}

int n,m;

signed main()
{
    cin>>n>>m;
    build(1,n,1);
    for(int o=1;o<=m;++o)
        {
            char op;
            cin>>op;
            if(op=='C')
                {
                    int l;
                    int r;
                    int v;
                    cin>>l>>r>>v;
                    r-=1;
                    chan(1,n,l,r,1,v);
                }
            else
                {
                    sum1=sum2=sum3=0;
                    int l,r;
                    cin>>l>>r;
                    r-=1;
                    fd(1,n,l,r,1);
                    int a=(r-l+1-r*l)*sum1+(r+l)*sum2-sum3;
                    int b=(r-l+2)*(r-l+1)/2;
                    int g=__gcd(a,b);
                    cout<<sum1<<' '<<sum2<<' '<<sum3<<' '<<endl<<a<<' '<<b<<' '<<endl;
                    printf("%lld/%lld\n",a/g,b/g);
                }
        }
    return 0;
}
2022/7/18 08:08
加载中...