社区讨论
70pts求鲦
P2122还教室参与者 4已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mhj2821o
- 此快照首次捕获于
- 2025/11/03 19:31 4 个月前
- 此快照最后确认于
- 2025/11/03 19:31 4 个月前
WA on #15-20,#15-19是
CPPread - ,expect 1.
CPP#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e5+10;
ll n,m,x,y,op;
ll k,tr[N*4],t[N*4],a[N],tr2[N*4];
void pushup(ll x)
{
tr[x]=tr[x*2]+tr[x*2+1];
tr2[x]=tr2[x*2]+tr2[x*2+1];
}
void pushdown(ll x,ll l,ll r)
{
ll mid=(l+r)>>1;
tr2[x*2]+=2*t[x]*tr[x*2]+(mid-l+1)*(t[x]*t[x]);
tr2[x*2+1]+=2*t[x]*tr[x*2+1]+(r-mid)*(t[x]*t[x]);
tr[x*2]+=t[x]*(mid-l+1);
tr[x*2+1]+=t[x]*(r-mid);
t[x*2]+=t[x];
t[x*2+1]+=t[x];
t[x]=0;
}
void build(ll l,ll r,ll p)
{
if(l==r)
{
tr[p]=a[l];
tr2[p]=a[l]*a[l];
return;
}
ll mid=l+r>>1;
build(l,mid,p*2);
build(mid+1,r,p*2+1);
pushup(p);
}
void changesum(ll l,ll r,ll findl,ll findr,ll p,ll C)
{
if(findl<=l&&r<=findr)
{
tr2[p]+=2*tr[p]*C+(r-l+1)*C*C;
tr[p]+=C*(r-l+1);
t[p]+=C;
return;
}
ll mid=(l+r)>>1;
pushdown(p,l,r);
if(findl<=mid) changesum(l,mid,findl,findr,p*2,C);
if(findr>mid) changesum(mid+1,r,findl,findr,p*2+1,C);
pushup(p);
}
ll getsum(ll l,ll r,ll findl,ll findr,ll p)
{
if(findl<=l&&r<=findr) return tr[p];
ll mid=(l+r)>>1;
ll sum=0;
pushdown(p,l,r);
if(findl<=mid) sum+=getsum(l,mid,findl,findr,p*2);
if(findr>mid) sum+=getsum(mid+1,r,findl,findr,p*2+1);
return sum;
}
ll getmoresum(ll l,ll r,ll findl,ll findr,ll p)
{
if(findl<=l&&r<=findr) return tr2[p];
ll mid=(l+r)>>1;
ll sum=0;
pushdown(p,l,r);
if(findl<=mid) sum+=getmoresum(l,mid,findl,findr,p*2);
if(findr>mid) sum+=getmoresum(mid+1,r,findl,findr,p*2+1);
return sum;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(ll i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
for(ll i=1;i<=m;i++)
{
cin>>op;
if(op==1)
{
cin>>x>>y>>k;
changesum(1,n,x,y,1,k);
}
else if(op==2)
{
cin>>x>>y;
ll sum=getsum(1,n,x,y,1);
ll gcd=__gcd(sum,y-x+1);
if(sum==0) cout<<"0/1\n";
else cout<<sum/gcd<<"/"<<(y-x+1)/gcd<<"\n";
}
else
{
cin>>x>>y;
ll sum=getsum(1,n,x,y,1),sum2=getmoresum(1,n,x,y,1);
ll gcd=__gcd(sum,y-x+1);
ll xfz=sum/gcd,xfm=(y-x+1)/gcd;
ll fm=(y-x+1)*xfm*xfm,fz=sum2*xfm*xfm-2*sum*xfz*xfm+xfz*xfz*(y-x+1);
gcd=__gcd(fz,fm);
if(fz==0) cout<<"0/1\n";
else cout<<fz/gcd<<"/"<<fm/gcd<<"\n";
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...