社区讨论

三十分且ac on #1 #3 #4,玄关求调

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@m03m9bz5
此快照首次捕获于
2024/08/21 16:53
2 年前
此快照最后确认于
2025/11/04 22:50
4 个月前
查看原帖
系数强制下传,开了long long,取模应该也没问题
C
#include<bits/stdc++.h>
using namespace std;
using itn = int;
const int N=1e5;
long long MOD=571373;
long long tree[N*4],add[N*4],mul[N*4],a[N*4];
int n,q,m;
void push_up(int p){tree[p]=(tree[p*2]+tree[p*2+1])%MOD;}
void push_down(int s,int t,int p){
//	if(!add[p]&&mul[p]==1) return ;
	int m=s+t>>1;
	tree[p*2]=(tree[p*2]*mul[p])%MOD;
	tree[p*2]=(tree[p*2]+add[p]*(m-s+1))%MOD;
	tree[p*2+1]=(tree[p*2+1]*mul[p])%MOD;
	tree[p*2+1]=(tree[p*2+1]+add[p]*(t-m))%MOD;
	
	add[p*2]*=mul[p];add[p*2+1]*=mul[p];
	add[p*2]+=add[p];add[p*2+1]+=add[p];
	mul[p*2]*=mul[p];mul[p*2+1]*=mul[p];
	
	add[p]=0;mul[p]=1;	

}
void build(int s,int t,int p){
	mul[p]=1;
	if(s==t){
		tree[p]=a[s];
		return ;
	}
	int m=s+t>>1;
	build(s,m,p*2);build(m+1,t,p*2+1);
	push_up(p);
}
void modify_add(int l,int r,int c,int s,int t,int p){
	if(t<l||r<s)	return ;
	if(l<=s&&t<=r){
		tree[p]=(tree[p]+c*(t-s+1))%MOD;
		add[p]+=c;
		return ;
	}
	push_down(s,t,p);
	int m=s+t>>1;
	modify_add(l,r,c,s,m,p*2);
	modify_add(l,r,c,m+1,t,p*2+1);
	push_up(p);
}
void modify_mul(int l,int r,int c,int s,int t,int p){
	if(t<l||r<s)	return ;
	if(l<=s&&t<=r){
		tree[p]=(tree[p]*c)%MOD;
		mul[p]*=c;
		add[p]*=c;
		return ;
	}
	push_down(s,t,p);
	int m=s+t>>1;
	modify_mul(l,r,c,s,m,p*2);
	modify_mul(l,r,c,m+1,t,p*2+1);
	push_up(p);
}
long long query(int l,int r,int s,int t,int p){
	if(t<l||r<s)	return 0;
	if(l<=s&&t<=r)	return tree[p];
	int m=s+t>>1;
	push_down(s,t,p);
	return query(l,r,s,m,p*2)+query(l,r,m+1,t,p*2+1);
}
void print(int s,int t,int p){
	int m=s+t>>1;
	printf("(%d,%d)%d t:%lld a:%lld m:%lld\n",s,t,p,tree[p],add[p],mul[p]);
	if(s==t) return ;
	print(s,m,p*2);print(m+1,t,p*2+1);
}
int main(){
	cin>>n>>q>>MOD;
	for(int i=1;i<=n;i++)	scanf("%lld",&a[i]);
	build(1,n,1);
	int op,x,y,k;
	for(itn i=1;i<=q;i++){
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d%d",&x,&y,&k);
			modify_mul(x,y,k,1,n,1);	
		}
		if(op==2){
			scanf("%d%d%d",&x,&y,&k);
			modify_add(x,y,k,1,n,1);
		}
		if(op==3){
			scanf("%d%d",&x,&y);
			printf("%lld\n",query(x,y,1,n,1)%MOD);
		}
//		print(1,n,1);
//		cout<<endl;
	}
	return 0;
}

回复

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

正在加载回复...