社区讨论

样例没过求调教 悬关

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

讨论操作

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

当前回复
9 条
当前快照
1 份
快照标识符
@lo1qs0ry
此快照首次捕获于
2023/10/23 01:27
2 年前
此快照最后确认于
2023/11/03 02:06
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define lc x<<1
#define rc (x<<1)|1
using namespace std;
int n,m,q,a[4000010];
struct node{
	int sm,mul,ad;
}tr[400010];
void update(int x){
	tr[x].sm=tr[lc].sm%q+tr[rc].sm%q;
}
void build(int x,int l,int r){
	tr[x].mul=1; 
	if(l==r) {
		tr[x].sm=a[l];
		return;
	}
	int mid=l+r>>1;
	build(lc,l,mid);build(rc,mid+1,r);
	update(x);
}
void pushdown(int x,int l,int r){
	if(tr[x].mul!=1){
		tr[lc].ad*=tr[x].mul%q+tr[x].ad;tr[rc].ad*=tr[x].mul%q+tr[x].ad;
		int mid=l+r >>1;
		tr[lc].sm*=tr[x].mul%q;tr[rc].sm*=tr[x].mul%q;	
		tr[lc].mul*=tr[x].mul%q;tr[rc].mul*=tr[x].mul%q;
		tr[lc].sm+=(mid-l+1)*tr[x].ad%q;tr[rc].sm+=(r-mid)*tr[x].ad%q;
		tr[x].mul=1;tr[x].ad=0;
	}
	if(tr[x].ad){
		int mid=l+r >>1;
		tr[lc].sm+=(mid-l+1)*tr[x].ad%q;tr[rc].sm+=(r-mid)*tr[x].ad%q;
		tr[lc].ad+=tr[x].ad%q;tr[rc].ad+=tr[x].ad%q;
		tr[x].ad=0;
	}
}
void modifyad(int x,int l,int r,int L,int R,int d){
	if(l==L&&r==R) {
		tr[x].sm+=(r-l+1)*d;
		tr[x].ad+=d;
		return;
	}
	int mid=l+r >>1;
	pushdown(x,l,r);
	if(R<=mid) modifyad(lc,l,mid,L,R,d);
	else if(L>mid) modifyad(rc,mid+1,r,L,R,d);
	else modifyad(lc,l,mid,L,mid,d),modifyad(rc,mid+1,r,mid+1,R,d);
	update(x);
}
void modifymul(int x,int l,int r,int L,int R,int d){
	if(l==L&&r==R) {
		tr[x].ad*=d%q;
		tr[x].sm*=d%q;
		tr[x].mul*=d%q; 
		return;
	}
	int mid=l+r >>1;
	pushdown(x,l,r);
	if(R<=mid) modifymul(lc,l,mid,L,R,d);
	else if(L>mid) modifymul(rc,mid+1,r,L,R,d);
	else modifymul(lc,l,mid,L,mid,d),modifymul(rc,mid+1,r,mid+1,R,d);
	update(x);
}
int query(int x,int l,int r,int L,int R){
	if(l==l&&r==R) return tr[x].sm;
	int mid=l+r>>1;
	pushdown(x,l,r);
	if(R<=mid) return query(lc,l,mid,L,R);
	else if(L>mid) return query(rc,mid+1,r,L,R);
	else return query(lc,l,mid,L,mid)+query(rc,mid+1,r,mid+1,R);
}

int main(){
    //freopen(" ","r",stdin);
    //freopen(" ","w",stdout);
	cin>> n >>  m>>q ;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--){
		int op,x,y,k;
		scanf("%d%d%d",&op,&x,&y);
		if(op==1){
			cin>> k;
			modifymul(1,1,n,x,y,k);
		}
		if(op==2){
			cin>> k;
			modifyad(1,1,n,x,y,k);
		}
		if(op==3){
			cout << query(1,1,n,x,y)%q<<'\n';
		}
	}
    //fclose(stdin);
    //fclose(stdout);
	return 0;
}

急急急我是急先锋

回复

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

正在加载回复...