关于分块有加法和乘法操作
  • 板块学术版
  • 楼主_lqs_
  • 当前回复11
  • 已保存回复11
  • 发布时间2023/4/30 16:45
  • 上次更新2023/10/23 17:07:57
查看原帖
关于分块有加法和乘法操作
664744
_lqs_楼主2023/4/30 16:45
void A1(int l,int r,int k){
	int s=w[l],t=w[r];
	if(s==t){
		for(int i=l;i<=r;i++) b[s]=(b[s]+a[i]*(k-1))%mod,a[i]=(a[i]*k)%mod;
		return;
	}
	for(int i=l;w[i]==s;i++) b[s]=(b[s]+a[i]*(k-1))%mod,a[i]=(a[i]*k)%mod;
	for(int i=r;w[i]==t;i--) b[t]=(b[t]+a[i]*(k-1))%mod,a[i]=(a[i]*k)%mod;
	for(int i=s+1;i<=t-1;i++) tag[i]=(tag[i]*k)%mod,b[i]=(b[i]*k)%mod;//相当于乘上标记 
	return; 
}
void A2(int l,int r,int k){
	int s=w[l],t=w[r];
	if(s==t){
		for(int i=l;i<=r;i++) a[i]=(a[i]+k)%mod,b[s]=(b[s]+k)%mod;
		return;
	}
	for(int i=l;w[i]==s;i++) a[i]=(a[i]+k)%mod,b[s]=(b[s]+k)%mod;
	for(int i=r;w[i]==t;i--) a[i]=(a[i]+k)%mod,b[t]=(b[t]+k)%mod;
	for(int i=s+1;i<=t-1;i++) tag[i]=(tag[i]+k)%mod,b[i]=(b[i]+lp[i]*k)%mod;
	return; 
}
int Q(int l,int r){
	int s=w[l],t=w[r],sum=0;
	if(s==t){
		for(int i=l;i<=r;i++) sum=(sum+a[i]+tag[s])%mod;
		return sum;
	}
	for(int i=l;w[i]==s;i++) sum=(sum+a[i]+tag[s])%mod;
	for(int i=r;w[i]==t;i--) sum=(sum+a[i]+tag[t])%mod;
	for(int i=s+1;i<=t-1;i++) sum=(sum+b[i])%mod;
	return sum;
} 

初学分块,发现这样写的话若标记为 00 且是乘法时会错,请大佬指出如何改进?码风类似 OI Wiki,没找到类似的码风......

2023/4/30 16:45
加载中...