分块,爆零了,求改改
查看原帖
分块,爆零了,求改改
418419
ko_no_lzx_da楼主2022/1/20 10:30
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
int t;
int n,f,L[10001],R[10001],a[10001]; 
int sum[10001],pos[10001],lan[10001];
void add(int l,int r,int k){
	int p=pos[l],q=pos[r];
	if(p==q){
		for(int i=l;i<=r;i++){
			a[i]+=k;
		}
		sum[p]+=k*(r-l+1);
	}else{
		for(int i=p+1;i<=q-1;i++){
			lan[i]+=k;
		}	
		for(int i=l;i<=R[p];i++){
			a[i]+=k;
			sum[i]+=k;
		}
		for(int i=L[q];i<=r;i++){
			a[i]+=k;
			sum[i]+=k;
		}
	}
	return; 
}
int find(int l,int r){
	int ans=0;
	int p=pos[l],q=pos[r];
	if(p==q){
		for(int i=l;i<=r;i++){
			ans+=a[i];
			ans+=lan[q];
		}
	}else{
		for(int i=p+1;i<=q-1;i++){
			ans+=sum[i]+lan[i]*(R[i]-L[i]);
		}	
		for(int i=l;i<=R[p];i++){
			ans+=a[i]+lan[p];
		}
		for(int i=L[q];i<=r;i++){
			ans+=a[i]+lan[q];
		}
	}
	return ans; 
}
int main(){
	cin >>n>>f;
	for(int i=1;i<=n;i++){
		cin >>a[i];
	}
	t=sqrt(n);
	for(int i=1;i<=n;i++){
		R[i]=i*t;
		L[i]=(i-1)*t+1;
	}
	if(R[t]<n){
		t++;
		L[t]=R[t-1]+1;
		R[t]=n;
	}
	for(int i=1;i<=t;i++){
		for(int j=L[i];j<=R[i];j++){
			pos[j]=i;
			sum[i]+=a[j];
		}
	}
	for(int i=1;i<=f;i++){
		int p;
		cin >>p;
		if(p==1){
			int l,r,k;;
			cin >>l>>r>>k;
			add(l,r,k);
//			for(int i=1;i<=n;i++){
//				cout <<a[i]+lan[pos[i]]<<" ";
//			}	
//			cout <<endl;
		}
		if(p==2){
			int k;
			cin >>k;
			a[1]+=k;
			sum[1]+=k;
		}
		if(p==3){
			int k;
			cin >>k;
			a[1]-=k;
			sum[1]-=k;
//			for(int i=1;i<=n;i++){
//				cout <<a[i]+lan[pos[i]]<<" ";
//			}	
//			cout <<endl;
		}
		if(p==4){
			int l,r;
			cin>>l>>r;
			cout<<find(l,r)<<endl;
		}
		if(p==5){
			if(lan[1]){
				cout <<a[1]+lan[1]<<endl;
			}else{
				cout <<a[1]<<endl;
			}
		}
	}//
//	for(int i=1;i<=n;i++){
//		cout <<a[i]+lan[pos[i]]<<" ";
//	}
//	cout <<t<<endl;
	return 0;
}


2022/1/20 10:30
加载中...