分块70pts求调
查看原帖
分块70pts求调
1278983
114514ABaa楼主2024/11/24 18:39

代码如下

#include<bits/stdc++.h>
using namespace std;
#define ULL unsigned long long
const int Maxn=1000001,Maxm=1001; 
ULL ans,b[Maxm];
int a[Maxn];
int l[Maxm],r[Maxm],belong[Maxm],biao[Maxm],block,m,c,d,e,f,p,q,len,T;
void rebuild(){
	len=sqrt(m);
	block=(m-1)/len+1;
	for(int i=1;i<=block;i++){
		l[i]=r[i]-1;r[i]=i*block;
	}
	r[block]=m;
    for(int i=1;i<=block;i++){
       for(int j=l[i];j<=r[i];j++){
       	belong[a[j]]=i;
       	b[i]+=a[j];
	   }
	}
}
void check(int x,int y){
	p=belong[x];
	q=belong[y];
	if(p==q){
		for(int i=x;i<=y;i++){
			ans+=a[i]+biao[p];
		}
		cout<<ans<<endl;ans=0;
	}
    else{
    	for(int i=x;i<=r[p];i++){
    		ans+=a[i]+biao[p];
		}
    	for(int i=l[q];i<=y;i++){
    		ans+=a[i]+biao[p];
		}
		for(int i=p+1;i<=q-1;i++){
			ans+=b[i]+block*biao[i];
		}
		cout<<ans<<endl;ans=0;
	}
}
void change(int x,int y,int w){
	p=belong[x];
	q=belong[y];
	if(p==q){
	for(int i=x;i<=y;i++){
	a[i]+=w;b[p]+=w;
		}}
	else{
		for(int i=x;i<=r[p];i++){
    	a[i]+=w;b[p]+=w;
		}
		for(int i=l[q];i<=y;i++){
    	a[i]+=w;b[q]+=w;
		}
		for(int i=p+1;i<=q-1;i++){
		biao[i]+=w;
		}
	}
}
int main(){ 
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>m>>T;
    for(int i=1;i<=m;i++){
    	cin>>a[i]; 
	}
	for(int i=1;i<=T;i++){
		cin>>c>>d>>e;
		if(c==2)check(d,e);
		else{
		cin>>f;change(d,e,f);
		}
	}
	} 
2024/11/24 18:39
加载中...