对拍看了半天都找不到自己错在哪儿,是不是没救了?
#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;
}