用分块写的,a1个点w6个点t3个点,求助。
查看原帖
用分块写的,a1个点w6个点t3个点,求助。
1405239
lbh123楼主2024/7/26 19:43
#include<bits/stdc++.h>
using namespace std;
int l[100001],r[100010],b[100001],sum[100001],tag[100001];
int main(){
	int n,m;
	cin>>n>>m;
	int N=sqrt(n);
	int blo=n/N;
	if(n%N)blo++;
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}
	for(int i=1;i<=blo;i++){
		l[i]=(i-1)*N+1;
		r[i]=min(n,i*N);
		for(int j=l[i];j<=r[i];j++){
			sum[i]+=b[j];
		}
	}
	for(int i=1;i<=m;i++){
		int x;
		cin>>x;
		if(x==1){
			int y,z,k,ls,rs;
			cin>>y>>z>>k;
			for(int j=1;j<=blo;j++){
				if(y==l[j]){
					ls=j;
					break;
				}else if(y>l[j]&&y<l[j+1]){
					ls=j+1;
					break;
				}
			}
			for(int j=1;j<=blo;j++){
				if(z==r[j]){
					rs=j;
					break;
				}else if(z>r[j]&&z<r[j+1]){
					rs=j;
					break;
				}
			}
			for(int j=ls;j<=rs;j++){
				tag[j]+=k;
				//cout<<"tag:"<<tag[j]<<" ";
			}
			//cout<<"ls:"<<l[ls]<<" rs:"<<r[rs]<<"\n";
			for(int j=y;j<l[ls];j++){
				b[j]+=k;
				sum[ls-1]+=k;
			}
			for(int j=r[rs]+1;j<=z;j++){
				b[j]+=k;
				//cout<<b[j]<<"\n";
				sum[r[rs]]+=k;
				//cout<<sum[rs]<<" "<<rs<<"\n";
			}
		}else{
			int y,z,ls,rs;
			long long ans=0;
			cin>>y>>z;
			for(int j=1;j<=blo;j++){
				if(y==l[j]){
					ls=j;
					break;
				}else if(y>l[j]&&y<l[j+1]){
					ls=j+1;
					break;
				}
			}
			for(int j=1;j<=blo;j++){
				if(z==r[j]){
					rs=j;
					break;
				}else if(z>r[j]&&z<r[j+1]){
					rs=j;
					break;
				}
			}
			//cout<<"ls:"<<ls<<"blo:"<<blo<<"rs:"<<rs<<"\n";
			for(int j=ls;j<=rs;j++){
				ans+=sum[j];
				ans+=tag[j]*N;
				//cout<<"tag:"<<tag[j]<<"sum:"<<sum[j]<<"ans:"<<ans<<"\n";
			}
			//cout<<l[ls]<<"    "<<r[rs]<<"\n";
			for(int j=y;j<l[ls];j++){
				ans+=b[j];
				for(int k=1;k<=l[ls];k++){
					if(l[k]-1==j){
						ans+=tag[l[k]];
					}
				//	cout<<ans<<" "<<l[k]<<"\n";
					//cout<<b[j]<<" "<<tag[l[k]]<<" "<<k<<" "<<j<<"\n";
				}
				
			}
			for(int j=r[rs]+1;j<=z;j++){
				ans+=b[j];
				for(int k=r[rs]+1;k<=blo;k++){
					if(r[k]+1==j){
						ans+=tag[r[k]];
					}
				//	cout<<ans<<" "<<l[k]<<"\n";
					//cout<<b[j]<<" "<<tag[r[k]]<<" "<<k<<" "<<j<<"\n";
				}
			}
			cout<<ans<<"\n";
		}
	}
	return 0;
} 
2024/7/26 19:43
加载中...