线段树2求助!
查看原帖
线段树2求助!
180708
lian_feng楼主2022/12/17 21:40

样例是过了,但0pts,自己瞎编数据也不对

比如输入:

4 3 100

1 2 3 4

1 1 3 2

2 2 3 2

3 1 4

会莫名其妙出来17(

#include<bits/stdc++.h>
#define maxn 100010
#define ll long long 
using namespace std;
ll n,m,p;
ll a[maxn];
ll ans[maxn*4],tag_add[maxn*4],tag_mul[maxn*4];
ll ls(ll x)
{
	return x*2;
}
ll rs(ll x)
{
	return x*2+1;
}
void push_up(ll x)
{
	ans[x]=ans[ls(x)]+ans[rs(x)];
	return;
}
void build(ll l,ll r,ll x)
{
	tag_mul[x]=1,tag_add[x]=0; 
	if(l==r)
	{
	    ans[x]=a[l];
	    return;
	}
	ll mid=(l+r)/2;
	build(l,mid,ls(x));
	build(mid+1,r,rs(x));
	push_up(x);
	return;
}
void add(ll l,ll r,ll x,ll num)
{
	ans[x]+=num*(r-l+1);
	tag_add[x]+=num;
	return;
}
void push_down_add(ll l,ll r,ll x)
{
	ll mid=(l+r)/2;
	add(l,mid,ls(x),tag_add[x]);
	add(mid+1,r,rs(x),tag_add[x]);
	tag_add[x]=0;
	return;
}
void update_add(ll l,ll r,ll x,ll lx,ll rx,ll num)
{
	if(l>=lx&&r<=rx)
	{
		add(l,r,x,num);
		return;
	}
	push_down_add(l,r,x);
	ll mid=(l+r)/2;
	if(mid>=lx)update_add(l,mid,ls(x),lx,rx,num);
	if(mid<rx)update_add(mid+1,r,rs(x),lx,rx,num);
	push_up(x);
	return;
}
void mul(ll l,ll r,ll x,ll num)
{
	ans[x]*=num;
	tag_mul[x]*=num;
	return;
}
void push_down_mul(ll l,ll r,ll x)
{
	ll mid=(l+r)/2;
	mul(l,mid,ls(x),tag_mul[x]);
	mul(mid+1,r,rs(x),tag_mul[x]);
	tag_mul[x]=1;
	return;
}
void update_mul(ll l,ll r,ll x,ll lx,ll rx,ll num)
{
	if(l>=lx&r<=rx)
	{
		mul(l,r,x,num);
		return;
	}
	push_down_mul(l,r,x);
	ll mid=(l+r)/2;
	if(mid>=lx)update_mul(l,mid,ls(x),lx,rx,num);
	if(mid<rx)update_mul(mid+1,r,rs(x),lx,rx,num);
	push_up(x);
	return;
}
ll answer(ll l,ll r,ll x,ll lx,ll rx)
{
	if(l>=lx&&r<=rx)
	{
		return ans[x];
	}
	ll mid=(l+r)/2,tot=0;
	push_down_mul(l,r,x);
	push_down_add(l,r,x);
	if(mid>=lx)tot+=answer(l,mid,ls(x),lx,rx);
	if(mid<rx)tot+=answer(mid+1,r,rs(x),lx,rx);
	return tot;
}
int main()
{
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,n,1);
	for(int i=0;i<m;i++)
	{
		int opt=0;
		cin>>opt;
		if(opt==1)
		{
			int x,y,k;
			cin>>x>>y>>k;
			update_mul(1,n,1,x,y,k);
		}
		else if(opt==2)
		{
			int x,y,k;
			cin>>x>>y>>k;
			update_add(1,n,1,x,y,k);
		}
		else
		{
			int x,y;
			cin>>x>>y;
			cout<<answer(1,n,1,x,y)%p<<endl;
		}
	}
	return 0;
}
2022/12/17 21:40
加载中...