求助P2357分块
  • 板块学术版
  • 楼主ko_no_lzx_da
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/2/23 19:47
  • 上次更新2023/10/28 07:53:12
查看原帖
求助P2357分块
418419
ko_no_lzx_da楼主2022/2/23 19:47
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std; 
int n,f,len;
int belong[100000],L[100000],R[100000];
int a[100000],lan[100000],sum[100000];
void aad(int l,int r,int k){
	for(int i=l,j=min(r,R[belong[l]]);i<=j;i++){
		a[i]+=k;
		sum[belong[l]]+=k;
	}
	if(belong[l]!=belong[r]){
		for(int i=L[belong[r]];i<=r;i++){
			a[i]+=k;
			sum[belong[r]]+=k;
		}
	}
	for(int i=belong[l]+1;i<belong[r];i++){
		lan[i]+=k;
		sum[i]+=(R[i]-L[i]+1)*k;
	}
} 
int find(int l,int r){
	int re=0;
	for(int i=l,j=min(r,R[belong[l]]);i<=j;i++){
		re+=a[i]+lan[belong[l]];
	}
	if(belong[l]!=belong[r]){
		for(int i=L[belong[r]];i<=r;i++){
			re+=a[i]+lan[belong[r]];
		}
	}
	for(int i=belong[l]+1;i<belong[r];i++){
		re+=sum[i]+lan[i]*(R[i]-L[i]+1);
	}
	return re;
} 
int main(){
	cin >>n>>f;
	len=sqrt(n);
	for(int i=1;i<=len;i++){
		L[i]=(i-1)*len+1;
		R[i]=i*len;
	}
	if(R[len]<n){
		len++;
		L[len]=R[len-1]+1;
		R[len]=n;
	}
	for(int i=1;i<=n;i++){
		cin >>a[i];
	}
	for(int i=1;i<=f;i++){
		int t,l,r,k;
		cin >>t;
		if(t==1){
			cin >>l>>r>>k;
			aad(l,r,k);
			for(int i=1;i<=n;i++){
				cout <<sum[i]+lan[belong[i]]*(R[i]-L[i]+1)<<" ";
			}
			cout <<endl;
		}else if(t==2){
			cin >>k;
			a[1]+=k;
			sum[1]+=k;
			for(int i=1;i<=n;i++){
				cout <<a[i]+lan[belong[i]]<<" ";
			}
			cout <<endl;
		}else if(t==3){
			cin >>k;
			a[1]-=k;
			sum[1]-=k;
			for(int i=1;i<=n;i++){
				cout <<a[i]+lan[belong[i]]<<" ";
			}
			cout <<endl;
		}else if(t==4){
			cin >>l>>r;
			cout <<find(l,r)<<endl;
		}else if(t==5){
			cout <<a[1]+lan[1]<<endl;
		} 
	}
	return 0;
}


2022/2/23 19:47
加载中...