社区讨论

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是
CPP
read - ,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 条回复,欢迎继续交流。

正在加载回复...