萌新刚学分块,#12 TLE 了,求助
查看原帖
萌新刚学分块,#12 TLE 了,求助
247555
Fool_Fish楼主2021/2/15 12:55

rt,这是我的代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
#define int long long
const int MAXN=1e5+5;
const int MAXM=2e3+5;
int n;
int a[MAXN];
int l[MAXM];
int r[MAXM];
int pos[MAXN];
int lazy[MAXM];
int sum[MAXN];
int maxn[MAXM];
int size;
int m;
void pre(){
	size=sqrt(n);
	m=ceil(1.0*n/size);
	for(int i=1;i<=m;i++){
		l[i]=r[i-1]+1;
		r[i]=i*size;
	} 
	r[m]=n;
	for(int i=1;i<=n;i++){
		pos[i]=(i-1)/size+1;
	}
	for(int i=1;i<=n;i++){
		sum[pos[i]]+=a[i];
		maxn[pos[i]]=max(maxn[pos[i]],a[i]);
	}
}
void update(int L,int R,int p){
	for(int i=L;i<=R;i++){
		a[i]%=p;
	}
	maxn[pos[L]]=0;
	sum[pos[L]]=0;
	for(int i=l[pos[L]];i<=r[pos[L]];i++){
		maxn[pos[L]]=max(maxn[pos[L]],a[i]);
		sum[pos[L]]+=a[i];
	}
} 
void mod(int ql,int qr,int p){
	if(pos[ql]==pos[qr]){
		update(ql,qr,p);
	}
	else{
		update(ql,r[pos[ql]],p);
		update(l[pos[qr]],qr,p);
		for(int i=pos[ql]+1;i<=pos[qr]-1;i++){
			if(maxn[i]>=p){
				update(l[i],r[i],p);
			} 
		}
	}
}
void add(int x,int k){
	sum[pos[x]]-=a[x];
	a[x]=k;
	sum[pos[x]]+=a[x];
	maxn[pos[x]]=0;
	for(int i=l[pos[x]];i<=r[pos[x]];i++){
		maxn[pos[x]]=max(maxn[pos[x]],a[i]);
	}
}
int query(int ql,int qr){
	if(pos[ql]==pos[qr]){
		int s=0;
		for(int i=ql;i<=qr;i++){
			s+=a[i];
		} 
		return s;
	}
	int s=0;
	for(int i=ql;i<=r[pos[ql]];i++){
		s+=a[i];
	}
	for(int i=pos[ql]+1;i<=pos[qr]-1;i++){
		s+=sum[i];
	} 
	for(int i=l[pos[qr]];i<=qr;i++){
		s+=a[i];
	} 
	return s;
}
signed main(){
	int M;
	scanf("%lld %lld",&n,&M);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	pre();
	for(int i=1;i<=M;i++){
		int type;
		scanf("%lld",&type);
		if(type==1){
			int l,r;
			scanf("%lld %lld",&l,&r);
			printf("%lld\n",query(l,r));
		}
		if(type==2){
			int l,r,x;
			scanf("%lld %lld %lld",&l,&r,&x);
			mod(l,r,x);
		}
		if(type==3){
			int k,x;
			scanf("%lld %lld",&k,&x);
			add(k,x);
		}
	}
return 0;
} 
2021/2/15 12:55
加载中...