求大佬看看,分块0分,样例过了,看了好几遍代码也不知道哪里错了
查看原帖
求大佬看看,分块0分,样例过了,看了好几遍代码也不知道哪里错了
418419
ko_no_lzx_da楼主2022/2/24 13:13
#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){
	//cout <<r<<" "<<l<<endl;
	for(int i=l,j=min(r,R[belong[l]]);i<=j;i++){
		a[i]+=k;
		//cout <<"[#"<<i<<"]:"<<a[i]<<endl;
		sum[belong[i]]+=k;
	}
	if(belong[l]!=belong[r]){
		for(int i=L[belong[r]];i<=r;i++){
			a[i]+=k;
			//cout <<"[$"<<i<<"]:"<<a[i]<<endl;
			sum[belong[i]]+=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]];
		//cout <<"re:"<<re<<endl;
	}
	if(belong[l]!=belong[r]){
		for(int i=L[belong[r]];i<=r;i++){
			re+=a[i]+lan[belong[r]];
			//cout <<"re:"<<re<<endl;
		}
	}
	for(int i=belong[l]+1;i<belong[r];i++){
		re+=sum[i];
		//cout <<"re:"<<re<<endl;
	}
	return re;
} 
int main(){
	cin >>n>>f;
	len=sqrt(n);
	//cout <<len<<endl;
	for(int i=1;i<=len;i++){
		L[i]=(i-1)*len+1;
		R[i]=i*len;
		//cout <<"}"<<L[i]<<" "<<R[i]<<endl;
	}
	if(R[len]<n){
		len++;
		L[len]=R[len-1]+1;
		R[len]=n;
		//cout <<"}"<<L[len]<<" "<<R[len]<<endl;
	}
	for(int i=1;i<=len;i++){
		for(int j=L[i];j<=R[i];j++){
			belong[j]=i;
		}
	}
	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 <<a[i]+lan[belong[i]]<<" ";
//			}
//			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/24 13:13
加载中...