社区讨论

真不会取模,救救孩子

P3373【模板】线段树 2参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lobixwx1
此快照首次捕获于
2023/10/29 21:46
2 年前
此快照最后确认于
2023/11/04 02:52
2 年前
查看原帖

各位Dalao教教咋取模吧,我搁着乱%p


CPP
#include<iostream>
#include<cstdio>
#define rg register 
using namespace std;

int n,m,p;
int a[100010],lazj[400040],lazc[400040]={1};
long long tr[400040];

void build(int x,int l,int r)
{
	if(l==r)
	 {
	 	tr[x]=a[l]; return ;
	 }
	int mid=(l+r)>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	tr[x]=(tr[x<<1]+tr[x<<1|1])%p; 
}
inline void pushdown(int x,int l,int r)
{
	int mid=(l+r)>>1;
	if(lazj[x])
	 {
	 	tr[x<<1]=(tr[x<<1]+tr[x<<1]*lazc[x]+(mid-l+1)*lazj[x])%p;
	 	tr[x<<1|1]=(tr[x<<1|1]+tr[x<<1|1]*lazc[x]+(r-mid)*lazj[x])%p;
	 	lazj[x<<1]=lazj[x<<1]*lazc[x]+lazj[x]; lazc[x<<1]*=lazc[x];
	 	lazj[x<<1|1]=lazj[x<<1|1]*lazc[x]+lazj[x]; lazc[x<<1|1]*=lazc[x];
	 	lazj[x]=0; lazc[x]=1;
	 }
}
void modify(int x,int l,int r,int ll,int rr,int kc,int kj)
{
	if(ll<=l&&r<=rr)
	 {
	 	tr[x]=(tr[x]*kc+(r-l+1)*kj)%p; 
	 	lazj[x]=lazj[x]*kc+kj; lazc[x]*=kc;
	 	return ;
	 }
	pushdown(x,l,r);
	int mid=(l+r)>>1;
	if(ll<=mid) modify(x<<1,l,mid,ll,rr,kc,kj);
	if(rr>mid) modify(x<<1|1,mid+1,r,ll,rr,kc,kj);
	tr[x]=tr[x<<1]+tr[x<<1|1];
}
long long query(int x,int l,int r,int ll,int rr)
{
	if(ll<=l&&r<=rr) return tr[x];
	pushdown(x,l,r);
	int mid=(l+r)>>1; long long sum=0;
	if(ll<=mid) sum=(sum+query(x<<1,l,mid,ll,rr))%p;
	if(rr>mid) sum=(sum+query(x<<1|1,mid+1,r,ll,rr))%p;
	return sum;
}

int main()
{
	cin>>n>>m>>p;
	for(rg int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,1,n);

	for(rg int i=1;i<=m;i++)
	 {
	 	int f,x,y; scanf("%d %d %d",&f,&x,&y);

	 	if(f==1)//*
	 	 {
	 	 	int k; scanf("%d",&k);
	 	 	modify(1,1,n,x,y,k,0);
	 	 }
	 	if(f==2)//+
	 	 {
	 	 	int k; scanf("%d",&k);
	 	 	modify(1,1,n,x,y,1,k);
	 	 }
	 	if(f==3)
		 {
		 	printf("%lld\n",query(1,1,n,x,y));
		 } 
	 }
	return 0; 
}

回复

2 条回复,欢迎继续交流。

正在加载回复...