0分求调!
查看原帖
0分求调!
320449
forest114514楼主2023/7/27 16:05
//蒟蒻一枚
#include<bits/stdc++.h>
#define id_l id<<1
#define id_r id<<1|1
#define MUL tree[id].lazy_mul
#define ADD tree[id].lazy_add
#define SUM tree[id].sum
#define mid (r+l>>1) 
#define SUML tree[id_l].sum 
#define SUMR tree[id_r].sum
#define MULL tree[id_l].lazy_mul
#define MULR tree[id_r].lazy_mul
#define ADDL tree[id_l].lazy_add
#define ADDR tree[id_r].lazy_add
#define int long long 
using namespace std;
typedef long long LL;
const int MAXN=1e5+10;
struct node{
	LL sum,lazy_add,lazy_mul;
}tree[MAXN<<2];
LL n,q,a[MAXN];
LL mod;
void pushup(int id){
	SUM=(SUML+SUMR)%mod;
}
void build(int id,int l,int r){
	MUL=1,ADD=0;
	if(l==r){
		tree[id].sum=a[l];
		return;
	}
	build(id_l,l,mid);
	build(id_r,mid+1,r);
	pushup(id);
}
void pushdown(int id,int ll,int rr){
	SUML=(SUML*MUL%mod+ll*ADD%mod)%mod;
	SUMR=(SUMR*MUL%mod+rr*ADD%mod)%mod;
	MULL*=MUL%mod;MULL%=mod; 
	MULR*=MUL%mod;MULR%=mod;
	ADDL*=MUL,ADDR*=MUL,ADDL%=mod,ADDL%=mod;
	ADDL+=ADD,ADDR+=ADD,ADDL%=mod,ADDR%=mod;
	MUL=1,ADD=0;
}
void update1(int id,int l,int r,int L,int R,LL k){
//	pushdown(id,l,r);
	if(l>=L&&r<=R){
		SUM=(SUM+(r-l+1)*k)%mod;
		ADD=(ADD+k)%mod;
		return;
	}
	pushdown(id,mid-l+1,r-mid);
	if(L<=mid)update1(id_l,l,mid,L,R,k);
	if(R>mid)update1(id_r,mid+1,r,L,R,k);
	pushup(id);
}
void update2(int id,int l,int r,int L,int R,LL k){
//	pushdown(id,l,r);
	if(l>=L&&r<=R){
		SUM=(SUM*k)%mod;
		MUL*=k,MUL%=mod;
		ADD*=k,ADD%=mod;
		return;
	}
	pushdown(id,mid-l+1,r-mid);
	if(L<=mid)update2(id_l,l,mid,L,R,k);
	if(R>mid)update2(id,mid+1,r,L,R,k);
	pushup(id);
}
LL query(int id,int l,int r,int L,int R){
	if(l>=L&&r<=R)return SUM%mod;
	pushdown(id,mid-l+1,r-mid);
	LL res=0;
	if(L<=mid)res+=query(id_l,l,mid,L,R)%mod;
	if(R>mid) res+=query(id_r,mid+1,r,L,R)%mod;
	return res%mod;
}
signed main(){
	ios::sync_with_stdio(false);
	scanf("%lld %lld %lld",&n,&q,&mod);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	int c,x,y;LL k;
	build(1,1,n);
//	for(int i=1;i<=n;i++) cout<<query(1,1,n,i,i)<<" ";cout<<endl;
	for(int i=1;i<=q;i++){
		scanf("%lld",&c);
		if(c==1){
			scanf("%lld %lld %lld",&x,&y,&k);
			update2(1,1,n,x,y,k);
		}
		else if(c==2){
			scanf("%lld %lld %lld",&x,&y,&k);
			update1(1,1,n,x,y,k);
		}
		else if(c==3) {
			scanf("%lld %lld",&x,&y);
			cout<<query(1,1,n,x,y)<<endl;
		}
//		for(int i=1;i<=n;i++) cout<<query(1,1,n,i,i)<<" ";cout<<endl;
	}
	return 0;
}

样例没过,但已经对比题解一行行看了一下没看出哪里有问题,有没有大佬帮蒟蒻看一下

2023/7/27 16:05
加载中...