求助,60PT真绝望了
查看原帖
求助,60PT真绝望了
523505
ISEKAI楼主2022/3/17 20:52

我已经在我能模的地方全模了,还是过不了

#include<bits/stdc++.h>
#define ls tree[u*2]
#define rs tree[u*2+1]
#define ll long long
using namespace std;
const ll N=1e5*4+5;
struct node{
	ll l,r,s,lzj;
	ll lzc=1;
}tree[N];
ll a[N],x,y,tp,k,n,m,P;
void bt(ll u,ll x,ll y)
{
	tree[u].l=x;
	tree[u].r=y;
	tree[u].lzj=0;
	tree[u].lzc=1;
	
	if(x==y)
	{
		tree[u].s=a[x]%P;
		return;
	}
	ll mid=(x+y)>>1;
	bt(u*2,x,mid);
	bt(u*2+1,mid+1,y);
	tree[u].s=(ls.s%P+rs.s%P)%P;
}
 void addtag(ll u,ll jia,ll ch)
{ll l=tree[u].l,r=tree[u].r,mid=(l+r)>>1;
	jia%=P; ch%=P;
//	tree[u].s*=ch; tree[u].s+=jia*(r-l+1); tree[u].s%=P;
//	tree[u].lzc*=ch; tree[u].lzc%=P;
//	tree[u].lzj*=ch; tree[u].lzj+=jia; tree[u].lzj%=P;
	
	tree[u].s=tree[u].s%P*ch+((r-l+1)*jia)%P;
	//tree[u].lzj*=ch; tree[u].lzj+=jia;
	tree[u].lzj= (tree[u].lzj*ch)%P+jia;
	tree[u].lzc= tree[u].lzc*ch;
	//tree[u].s=tree[u].s*tree[u].lzc+(r-l+1)*tree[u].lzj;
	tree[u].lzj%=P; tree[u].lzc%=P; tree[u].s%=P;
}
 void down(ll u)
{ll l=tree[u].l,r=tree[u].r,mid=(l+r)>>1;

	//if(tree[u].lzj==0&&tree[u].lzc==1) return;
	if(l==r) return;
	addtag(u*2,tree[u].lzj,tree[u].lzc);
	addtag(u*2+1,tree[u].lzj,tree[u].lzc);
	tree[u].lzj=0; tree[u].lzc=1;
}
 void jia(ll u,ll x,ll y,ll k)
{ll l=tree[u].l,r=tree[u].r,mid=(l+r)>>1;
	
	if(x<=l&&y>=r)
	{
//		tree[u].s+=k*(l-r+1); tree[u].s%=P;
//		tree[u].lzj+=k; tree[u].s%=P;
		addtag(u,k,1);
		return;
	}
	down(u);
	if(x<=mid){
		jia(u*2,x,y,k);
	}
	if(y>mid){
		jia(u*2+1,x,y,k);
	}
	tree[u].s=ls.s%P+rs.s%P;
	tree[u].s%=P;
}
 void cheng(ll u,ll x,ll y,ll k)
{ll l=tree[u].l,r=tree[u].r,mid=(l+r)>>1;

	if(x<=l&&y>=r)
	{
//		tree[u].s*=k; tree[u].s%=P;
//		tree[u].lzc*=k; tree[u].lzc%=P;
		addtag(u,0,k);
		return;
	}
	down(u);
	if(x<=mid){
		cheng(u*2,x,y,k);
	}
	if(y>mid){
		cheng(u*2+1,x,y,k);
	}
	tree[u].s=ls.s%P+rs.s%P;
	tree[u].s%=P;
}
 ll sum(ll u,ll x,ll y)
{ll l=tree[u].l,r=tree[u].r,mid=(l+r)>>1;
	
	if(x<=l&&y>=r) return tree[u].s%=P;
	down(u);
	ll ans=0;
	if(x<=mid) ans+=sum(u*2,x,y),ans%=P;
	if(y>mid)	ans+=sum(u*2+1,x,y),ans%=P;
	return ans%P;
}
int main()
{
	cin>>n>>m>>P;
	for(ll i=1;i<=n;++i)
	{
		cin>>a[i];
	}
	bt(1,1,n);
	
	for(ll i=1;i<=n;++i)
	{
		cin>>tp;
		switch(tp)
		{
			case 1:
				cin>>x>>y>>k;
				cheng(1,x,y,k%P);break;
			case 2:
				cin>>x>>y>>k;
				jia(1,x,y,k%P);break;
			case 3:
				cin>>x>>y;
				cout<<sum(1,x,y)%P<<endl;break;
		}
	}
	
}
2022/3/17 20:52
加载中...