求助线段树,玄关
查看原帖
求助线段树,玄关
685114
BDFZ_hym_AK_hym_ing楼主2024/12/18 13:21

这是题目:P3373 【模板】线段树 2

问题:样例过了but只对了1、3、4共3个点

下面是代码:

#include<bits/stdc++.h>
using namespace std;
struct tree{
	long long l,r;
	long long sum,lazy_p,lazy_m;
}d[1000005];
long long n,m,mod;
long long a[1000005];
void build_tree(long long l,long long r,long long z){
	d[z].l=l;
	d[z].r=r;
	d[z].lazy_m=1;
	d[z].lazy_p=0;
	if(l==r)
	{
		d[z].sum=a[l];
		d[z].sum%=mod;
		return;
	}
	long long mid=(d[z].l+d[z].r)/2;
	build_tree(l,mid,z*2);
	build_tree(mid+1,r,z*2+1);
	d[z].sum=d[2*z].sum+d[2*z+1].sum;
	d[z].sum%=mod;
}
void put_lazy(long long z){
	if(d[z].lazy_m!=1)
	{
		d[z*2].sum*=d[z].lazy_m;
		d[z*2+1].sum*=d[z].lazy_m;
		d[z*2].sum%=mod;
		d[z*2+1].sum%=mod;
		
		d[z*2].lazy_m*=d[z].lazy_m;
		d[z*2+1].lazy_m*=d[z].lazy_m;
		d[z*2].lazy_m%=mod;
		d[z*2+1].lazy_m%=mod;
		
		d[z].lazy_m=1;
	}
	if(d[z].lazy_p)
	{
		d[z*2].sum+=d[z].lazy_p*(d[z*2].r-d[z*2].l+1);
		d[z*2+1].sum+=d[z].lazy_p*(d[z*2+1].r-d[z*2+1].l+1);
		d[z*2].sum%=mod;
		d[z*2+1].sum%=mod;
		
		d[z*2].lazy_p+=d[z].lazy_p;
		d[z*2+1].lazy_p+=d[z].lazy_p;
		d[z*2].lazy_p%=mod;
		d[z*2+1].lazy_p%=mod;
		
		d[z].lazy_p=0;
	}
}
void mult_tree(long long x,long long y,long long z,long long k){
	if(x<=d[z].l&&d[z].r<=y)
	{
		d[z].sum*=k;
		d[z].lazy_p*=k;
		d[z].lazy_m*=k;
		d[z].lazy_m%=mod;
		d[z].lazy_p%=mod;
		d[z].sum%=mod;
		return;
	}
	put_lazy(z);
	long long mid=(d[z].l+d[z].r)/2;
	if(x<=mid)
	{
		mult_tree(x,y,2*z,k);
	}
	if(y>mid)
	{
		mult_tree(x,y,2*z+1,k);
	}
	d[z].sum=d[2*z].sum+d[2*z+1].sum;
	d[z].sum%=mod;
}
void plus_tree(long long x,long long y,long long z,long long k){
	if(x<=d[z].l&&d[z].r<=y)
	{
		d[z].sum+=k*(d[z].r-d[z].l+1);
		d[z].sum%=mod;
		d[z].lazy_p+=k;
		d[z].lazy_p%=mod;
		return;
	}
	put_lazy(z);
	long long mid=(d[z].l+d[z].r)/2;
	if(x<=mid)
	{
		plus_tree(x,y,2*z,k);
	}
	if(y>mid)
	{
		plus_tree(x,y,2*z+1,k);
	}
	d[z].sum=d[2*z].sum+d[2*z+1].sum;
	d[z].sum%=mod;
}
long long ask_tree(long long x,long long y,long long z){
	if(x<=d[z].l&&d[z].r<=y)
	{
		return d[z].sum;
	}
	put_lazy(z);
	long long mid=(d[z].l+d[z].r)/2,ans=0;
	if(x<=mid)
	{
		ans+=ask_tree(x,y,2*z);
		ans%=mod;
	}
	if(y>mid)
	{
		ans+=ask_tree(x,y,2*z+1);
		ans%=mod;
	}
	return ans;
}
int main(){

	ios::sync_with_stdio(false);
	cin.tie();
	cout.tie();
	cin>>n>>m>>mod;
	long long i;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build_tree(1,n,1);
	while(m--)
	{
		long long op;
		long long x,y;
		cin>>op>>x>>y;
		if(op==1)
		{
			long long k;
			cin>>k;
			mult_tree(x,y,1,k);
		}
		if(op==2)
		{
			long long k;
			cin>>k;
			plus_tree(x,y,1,k);
		}
		if(op==3)
		{
			cout<<ask_tree(x,y,1)%mod<<"\n";
		}
	}

	return 0;
}
2024/12/18 13:21
加载中...