全wa,但样例过了
查看原帖
全wa,但样例过了
718203
DarkWing楼主2024/7/13 20:41

求大佬帮忙调一下,真的不知道哪里错了orz

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=100005,INF=0x3f3f3f3f;
ll n,m,a[N],M;
struct Node
{
	ll l,r,v,add,mcl;
}tr[4*N];
void push_up(ll u)
{
	tr[u].v=(tr[u<<1].v+tr[u<<1|1].v)%M;
}
void push_down1(ll u)
{
	if(tr[u].mcl==1)
		return;
	tr[u<<1].v*=tr[u].mcl%M;
	tr[u<<1|1].v*=tr[u].mcl%M;
	tr[u<<1].mcl*=tr[u].mcl;
	tr[u<<1|1].mcl*=tr[u].mcl;
	tr[u].mcl=1;
}
void push_down(ll u)
{
	if(!tr[u].add)
		return;
	tr[u<<1].v+=tr[u].add*(tr[u<<1].r-tr[u<<1].l+1)%M;
	tr[u<<1|1].v+=tr[u].add*(tr[u<<1|1].r-tr[u<<1|1].l+1)%M;
	tr[u<<1].add+=tr[u].add;
	tr[u<<1|1].add+=tr[u].add;
	tr[u].add=0;
}
void build(ll u,ll l,ll r)
{
	tr[u]={l,r,a[l],0,1};
	if(l==r)
	{
		//	tr[u].v=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	push_up(u);
}
ll query(int u,int l,int r)
{
	if(l<=tr[u].l&&tr[u].r<=r)
		return tr[u].v;
	push_down1(u);
	push_down(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	ll ans=0; 
	if(l<=mid)
		ans+=query(u<<1,l,r);
	ans%=M;
	if(r>mid)
		ans+=query(u<<1|1,l,r);
	ans%=M;
	return ans;
}
void updateQJ(ll u,ll l,ll r,ll k)
{
	if(l<=tr[u].l&&tr[u].r<=r)
	{
		tr[u].v+=(tr[u].r-tr[u].l+1)*k;
		tr[u].v%=M;
		tr[u].add+=k;
		return;
	}
	push_down(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(l<=mid)
		updateQJ(u<<1,l,r,k);
	if(r>mid)
		updateQJ(u<<1|1,l,r,k);
	push_up(u);
}
void updateQJ1(ll u,ll l,ll r,ll k)
{
	if(l<=tr[u].l&&tr[u].r<=r)
	{
		tr[u].v*=k;
		tr[u].v%=M;
		tr[u].mcl*=k;
		return;
	}
	push_down1(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(l<=mid)
		updateQJ1(u<<1,l,r,k);
	if(r>mid)
		updateQJ1(u<<1|1,l,r,k);
	push_up(u);
}
void update(ll u,ll x,ll k)
{
	if(tr[u].l==x&&tr[u].r==x)
	{
		tr[u].v+=k;
		return;
	}
	ll mid=(tr[u].l+tr[u].r)>>1;
	if(x<=mid)
		update(u<<1,x,k);
	else
		update(u<<1|1,x,k);
	push_up(u);
}
int c;
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m>>M;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
//	cout<<query(1,1,n)<<endl;
//	updateQJ1(1,1,n,2);
//	cout<<query(1,1,n)<<endl;
	while(m--)
	{
		cin>>c;
		if(c==1)
		{
			ll x,y,k;
			cin>>x>>y>>k;
			updateQJ1(1,x,y,k);
		}
		if(c==2)
		{
			ll x,y,k;
			cin>>x>>y>>k;
			updateQJ(1,x,y,k);
		}
		if(c==3)
		{
			ll x,y;
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		}
	}
	return 0;
}
2024/7/13 20:41
加载中...