蒟蒻分块写挂,道德的沦丧还是人性的扭曲?
查看原帖
蒟蒻分块写挂,道德的沦丧还是人性的扭曲?
261262
WaltVBAlston楼主2021/11/4 08:42

RT,蒟蒻刚学分块,然后就写挂了,求大佬帮忙康康,谢谢:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int block,n,m,mod;
int tag_plus[355],tag_mul[355],sum[355],a[100005],p[100005],len[100005];
int now=0,now_block=1;
void update_mul(int x,int y,int k){
	for(int i=x;i<=y;i++){
		if(i%block==1&&i+len[p[i]]-1<=y){
			tag_mul[p[i]]*=k;
			sum[p[i]]*=k;
			tag_plus[p[i]]*=k;
			i+=len[p[i]]-1;
		}
		else{
			sum[p[i]]-=a[i];
			a[i]*=k;
			sum[p[i]]+=a[i];
		}
	}
	return;
}
void update_plus(int x,int y,int k){
	for(int i=x;i<=y;i++){
		if(i%block==1&&i+len[p[i]]-1<=y){
			sum[p[i]]+=k;
			tag_plus[p[i]]+=k;
			i+=len[p[i]]-1;
		}
		else{
			a[i]+=k;
			sum[p[i]]+=k;
		}
	}
	return;
}
int query(int x,int y){
	int res=0;
	for(int i=x;i<=y;i++){
		if(i%block==1&&i+len[p[i]]-1<=y){
			res+=sum[p[i]];
			i+=len[p[i]]-1;
		}
		else{
			res+=a[i]*tag_mul[i]+tag_plus[i];
		}
	}
	return res;
}
int main(){
	cin>>n>>m>>mod;
	block=sqrt(n);
	tag_mul[1]=1;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		now++;
		if(now>block)
			now=1,now_block++,tag_mul[i]=1;
		p[i]=now_block;
		sum[p[i]]+=a[i];
		len[p[i]]++;
	}
	while(m--){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1){
			int k;
			cin>>k;
			update_mul(x,y,k);
		}
		else if(op==2){
			int k;
			cin>>k;
			update_plus(x,y,k);
		}
		else
			cout<<query(x,y)<<endl;
	}
	return 0;
}
2021/11/4 08:42
加载中...