新手学线段树,求调!!!
查看原帖
新手学线段树,求调!!!
882092
zMinYu楼主2023/4/21 20:51

样例过了,但 0 pts 。

评测记录

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
ll n,m,p;
struct node
{
	ll  l,r;
	ll num;
}tr[N*4];
ll a[N],lazy_plus[N*4],lazy_times[N*4];
void pushup(ll u)
{
	tr[u].num=tr[u<<1].num%p+tr[u<<1|1].num%p;
}
void build(ll u,ll l,ll r)
{
	lazy_plus[u]=0;
	lazy_times[u]=1;
	if(l==r)
	{
		tr[u].num=a[l];
		tr[u].l=l;
		tr[u].r=r;
	}
	else
	{
		tr[u].l=l;
		tr[u].r=r;
		ll mid=(l+r)/2;
		build(u<<1,l,mid);
		build(u<<1|1,mid+1,r);
		pushup(u);
	}
}
//点修改
//void modify(int u,int l,int r,int x,int k) //将编号为x的值加k
//{
//	if(l==r)
//	{
//		tr[u].num=tr[u].num+k;
//	}
//	else
//	{
//		int mid=(l+r)/2;
//		if(x<=mid) modify(u<<1,l,mid,x,k);
//		if(x>mid) modify(u<<1,mid+1,r,x,k);
//		pushup(u);
//	}
//}
void pushdown(ll u,ll ln,ll rn)
{
//	if(lazy[u])
//	{
		lazy_plus[u<<1]+=lazy_plus[u];lazy_plus[u<<1]%=p;
		lazy_plus[u<<1|1]+=lazy_plus[u];lazy_plus[u<<1|1]%=p;
		tr[u<<1].num+=lazy_plus[u]*ln;tr[u<<1].num%=p;
		tr[u<<1|1].num+=lazy_plus[u]*rn;tr[u<<1|1].num%=p;
		lazy_plus[u]=0;
		lazy_times[u<<1]*=lazy_times[u];
		lazy_times[u<<1|1]*=lazy_times[u];
		tr[u<<1].num*=lazy_times[u];
		tr[u<<1|1].num*=lazy_times[u];
		lazy_times[u]=1;
//	}
}
void modify_plus(ll u,ll L,ll R,ll k)
{
	if(tr[u].l>=L&&tr[u].r<=R)
	{
		tr[u].num+=(tr[u].r-tr[u].l+1)*k;
		tr[u].num%=p;
		lazy_plus[u]+=k;
		lazy_plus[u]%=p;
	}
	else
	{
		ll mid=(tr[u].l+tr[u].r)/2;
		pushdown(u,mid-tr[u].l+1,tr[u].r-mid);
		if(L<=mid) modify_plus(u<<1,L,R,k);
		if(R>mid) modify_plus(u<<1|1,L,R,k);
		pushup(u);
	}
}
void modify_times(ll u,ll L,ll R,ll k)
{
	ll mid=(tr[u].l+tr[u].r)/2;
	if(tr[u].l>=L&&tr[u].r<=R)
	{
		pushdown(u,mid-tr[u].l+1,tr[u].r-mid);
		tr[u].num*=k;
		lazy_times[u]*=k;
	}
	else
	{
		pushdown(u,mid-tr[u].l+1,tr[u].r-mid);
		if(L<=mid) modify_times(u<<1,L,R,k);
		if(R>mid) modify_times(u<<1|1,L,R,k);
		pushup(u);
	}
}
ll query(ll u,ll L,ll R)
{
	if(tr[u].l>=L&&tr[u].r<=R)
	{
		return tr[u].num;
	}
	ll mid=(tr[u].l+tr[u].r)/2;
	pushdown(u,mid-tr[u].l+1,tr[u].r-mid);
	ll ans=0;
	if(L<=mid) ans+=query(u<<1,L,R)%p;
	if(R>mid) ans+=query(u<<1|1,L,R)%p;
	return ans%p;
}
int main()
{
	cin>>n>>m>>p;
	for(ll i=1;i<=n;i++)
	{
		cin>>a[i];
//		lazy_times[i*4-3]=1;
//		lazy_times[i*4-2]=1;
//		lazy_times[i*4-1]=1;
//		lazy_times[i*4]=1;
	}
	build(1,1,n);
	ll op,x,y,k;
	while(m--)
	{
		cin>>op;
		if(op==1)
		{
			cin>>x>>y>>k;
			modify_times(1,x,y,k);
		}
		if(op==2)
		{
			cin>>x>>y>>k;
			modify_plus(1,x,y,k);
		}
		else if(op==3)
		{
			cin>>x>>y;
			cout<<query(1,x,y)%p<<"\n";
		}
	}
	return 0;
}
2023/4/21 20:51
加载中...