分块10pts求调
查看原帖
分块10pts求调
761125
Milthm楼主2023/7/24 18:43
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
int n,m,len,a[100005],f[1005],s[1005],e[1005],size[1005];
int lazy[1005];
int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
signed main(){
	cin>>n>>m;
	len=sqrt(n);
	for(int i=1;i<=n;++i)a[i]=read();
	for(int i=1;i<=len;++i){
		s[i]=(i-1)*n/len+1,e[i]=i*n/len;
		for(int j=s[i];j<=e[i];++j)f[i]+=a[j];
		size[i]=e[i]-s[i]+1;
		//cout<<f[i]<<" "<<s[i]<<" "<<e[i]<<"\n";
	}
	while(m--){
		int p,l,r,k;
		p=read();
		if(p==1){
			l=read();
			r=read();
			k=read();
			for(int i=1;i<=len;++i){
				if(l>s[i]&&l<=e[i]){
					for(int j=l;j<=min(e[i],r);++j)a[j]+=k;
				}
				else if(l<=s[i]&&e[i]<=r){
					lazy[i]+=k;
				}
				else if(r>=s[i]&&r<=e[i]){
					for(int j=max(l,s[i]);j<=r;++j)a[j]+=k;
				}
				else if(s[i]>r)break;
			}
		}
		else{
			l=read();
			r=read();
			int ans=0;
			for(int i=1;i<=len;++i){
				if(l>s[i]&&l<=e[i]){
					for(int j=l;j<=min(e[i],r);++j)ans+=a[j]+lazy[i];
				}
				else if(l<=s[i]&&e[i]<=r){
					ans+=f[i]+lazy[i]*size[i];
				}
				else if(r>=s[i]&&r<=e[i]){
					for(int j=max(l,s[i]);j<=r;++j)ans+=a[j]+lazy[i];
				}
				else if(s[i]>r)break;
			}
			printf("%lld\n",ans);
		}
		/*
		cout<<"-----------------\n";
		for(int i=1;i<=len;++i){
			cout<<lazy[i]<<" ";
		}
		cout<<endl;
		for(int i=1;i<=n;++i){
			cout<<a[i]<<" ";
		}
		cout<<endl<<"------------------\n";
		*/
	}
	
	return 0;
}

蒟蒻不会分块,瞎写的(我甚至不知道这是不是分块),大佬们看看哪里错了(

2023/7/24 18:43
加载中...