听说灌水区人多,求调
  • 板块灌水区
  • 楼主xiaoxiaoyyds
  • 当前回复0
  • 已保存回复10
  • 发布时间2024/1/22 10:59
  • 上次更新2024/1/22 14:20:17
查看原帖
听说灌水区人多,求调
793036
xiaoxiaoyyds楼主2024/1/22 10:59

P5280 ZJOI2019 线段树

#include <bits/stdc++.h>
using namespace std;
const long long N=600005,MOD=998244353;
long long n,m,g[N],f[N],tf[N],tg[N],ans[N],k=1;
void build(long long o,long long l,long long r){
	g[o]=tf[o]=tg[o]=1;
	if(l==r)return ;
	long long mid=(l+r)/2;
	build(o*2,l,mid),build(o*2+1,mid+1,r);
}
void pushtf(long long o,long long x){
	f[o]=(f[o]*x)%MOD,tf[o]=(tf[o]*x)%MOD,ans[o]=(ans[o]*x)%MOD;
}
void pushtg(long long o,long long x){
	g[o]=(g[o]*x)%MOD,tg[o]=(tg[o]*x);
}
void pushdown(long long o){
//	if(tf[o]!=1){
		pushtf(o*2,tf[o]),pushtf(o*2+1,tf[o]),tf[o]=1;	
//	}
//	if(tg[o]!=1){
		pushtg(o*2,tg[o]),pushtg(o*2+1,tg[o]),tg[o]=1;	
//	}
}
void pushup(long long o){
	ans[o]=(f[o]+(ans[o*2]+ans[o*2+1])%MOD)%MOD;
}
void cha(long long o,long long L,long long R,long long l,long long r){
	pushdown(o);
	
	if(l==L&&r==R){
		f[o]=(f[o]+k)%MOD;
		pushtf(o*2,2),pushtf(o*2+1,2);
	}else{
		long long mid=(l+r)/2;
		long long uu=o*2+1,ll=o*2;
		g[o]=(g[o]+k)%MOD;
		if(R<=mid){
			cha(ll,L,R,l,mid);
		    pushdown(uu);
		  	f[uu]=(f[uu]+((k-g[uu]+MOD)%MOD))%MOD;
			g[uu]=(g[uu]*2)%MOD;
			pushtg(uu*2,2ll),pushtg(uu*2+1,2ll);
			pushtf(uu*2,2ll),pushtf(uu*2+1,2ll);
			pushup(uu);
		}else{
			if(L>mid){
				cha(uu,L,R,mid+1,r);
				pushdown(ll);
				f[ll]=(f[ll]+((k-g[ll]+MOD)%MOD))%MOD;
				g[ll]=(g[ll]*2)%MOD;
				pushtg(ll*2,2ll),pushtg(ll*2+1,2ll);
				pushtf(ll*2,2ll),pushtf(ll*2+1,2ll);
				pushup(ll);
			}else{
				cha(ll,L,mid,l,mid);
				cha(uu,mid+1,R,mid+1,r);
			}
		}
	}
	pushup(o);
}
int main(){
	cin>>n>>m;
	build(1,1,n);
	long long op,ll,rr;
	for(long long i=1;i<=m;i++){
		cin>>op;
		if(op==1){
			cin>>ll>>rr;
			cha(1,ll,rr,1,n);
			k=k*2ll%MOD;
		}else{
			 cout<<ans[1]<<"\n";
		}
	}
}
2024/1/22 10:59
加载中...