样例过了,但全WA(悬二关)
查看原帖
样例过了,但全WA(悬二关)
964876
_maple_leaf_楼主2024/6/24 10:49

rt,敲的线段树,这是代码,看不出错哪了,求条

#include<bits/stdc++.h>
#define int __int128
using namespace std;
inline int read(){
	char c=getchar();
	int ret=0,f=1;
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		ret=(ret<<3)+(ret<<1)+c-'0';
		c=getchar();
	}return ret*f;
}
inline void write(int x,int op){
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10,0);
	putchar((char)(x%10+'0'));
	if(op){
		if(op>0)puts("");
		if(op<0)putchar(' ');
		if(op==0)puts("114514");
	}
}
const int N=4e5+10;
int n,p,k,a[N];
struct node{
	int ad,mu=1,t;
}tree[N];
void push_up(int id){
	tree[id].t=(tree[id*2].t+tree[id*2+1].t)%p;
}
void push_down(int id,int l,int r){
	if(tree[id].ad){
		int mid=(l+r)>>1;
		tree[id*2].ad=tree[id*2].ad*tree[id].mu%p;
		tree[id*2].ad=(tree[id*2].ad+tree[id].ad)%p;
		tree[id*2].t=tree[id*2].t*tree[id].mu%p;
		tree[id*2].t=(tree[id*2].t+tree[id].ad*(mid-l+1)%p)%p;
		tree[id*2].mu=tree[id*2].mu*tree[id].mu%p;
		tree[id*2+1].ad=tree[id*2+1].ad*tree[id].mu%p;
		tree[id*2+1].ad=(tree[id*2+1].ad+tree[id].ad)%p;
		tree[id*2+1].t=tree[id*2+1].t*tree[id].mu%p;
		tree[id*2+1].t=(tree[id*2+1].t+tree[id].ad*(r-mid)%p)%p;
		tree[id*2+1].mu=tree[id*2+1].mu*tree[id].mu%p;
		tree[id].ad=0,tree[id].mu=1; 
	}
}
void bui(int id,int l,int r){
	if(l==r){
		tree[id].t=a[l]%p;
		return ;
	}
	int mid=(l+r)>>1;
	bui(id*2,l,mid);
	bui(id*2+1,mid+1,r);
	tree[id].t=(tree[id*2].t+tree[id*2+1].t)%p; 
}
void gx(int id,int l,int r,int x,int y,int v){
	if(x<=l&&r<=y){
		tree[id].t=(tree[id].t+v*(r-l+1)%p)%p;
		tree[id].ad=(tree[id].ad+v);
		return ;
	}
	push_down(id,l,r);
	int mid=(l+r)>>1;
	if(x<=mid)gx(id*2,l,mid,x,y,v);
	if(y>mid)gx(id*2+1,mid+1,r,x,y,v);
//	push_down(id*2,l,r);
//	push_down(id*2+1,l,r);
	push_up(id);
}
void gxm(int id,int l,int r,int x,int y,int v){
	if(x<=l&&r<=y){
		tree[id].mu=tree[id].mu*v%p;
		tree[id].ad=tree[id].ad*v%p;
	    tree[id].t=tree[id].t*v%p;
		return ;
	}
	push_down(id,l,r);
	int mid=(l+r)>>1;
	if(x<=mid)gxm(id*2,l,mid,x,y,v);
	if(y>mid)gxm(id*2+1,mid+1,r,x,y,v);
//	push_down(id*2,l,r);
//	push_down(id*2+1,l,r);
	push_up(id);
}
int find(int id,int l,int r,int x,int y){
	if(x<=l&&y>=r)return tree[id].t;
	push_down(id,l,r);
	int mid=(l+r)>>1,ret=0;
	if(x<=mid)ret=(ret+find(id*2,l,mid,x,y))%p;
	if(y>mid)ret=(ret+find(id*2+1,mid+1,r,x,y))%p;
	push_up(id); 
	return ret%p;
}
signed main(){
	n=read(),p=read();
	for(int i=1;i<=n;i++)a[i]=read();
	bui(1,1,n);
	k=read();
	for(int i=1;i<=k;i++){
		int op=read();
		if(op==1){
			int x=read(),y=read(),k=read();
			gxm(1,1,n,x,y,k);
		}else if(op==2){
			int x=read(),y=read(),k=read();
			gx(1,1,n,x,y,k);
		}else{
			int x=read(),y=read();
			write(find(1,1,n,x,y)%p,1);
		}
	}
	return 0;
}
2024/6/24 10:49
加载中...