分块无法通过吗?
查看原帖
分块无法通过吗?
1373205
dg114514楼主2025/1/11 10:53

rt

#ifndef ONLINE_JUDGE
#pragma GCC optimize(2)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline","fast-math","unroll-loops","no-stack-protector")
#pragma GCC diagnostic error "-fwhole-program"
#pragma GCC diagnostic error "-fcse-skip-blocks"
#pragma GCC diagnostic error "-funsafe-loop-optimizations"
#endif
#include<bits/stdc++.h>
#define int long long
using namespace std;
constexpr int N=1e5+5,SN=2e3+5;
int len,num,n,q,L[SN],R[SN],pos[N],sum[SN],tag[SN],a[N];
void init(){
	len=sqrt(n)+5,num=n/len;
	for(int i=1;i<=num;i++)
		L[i]=R[i-1]+1,R[i]=L[i]+len-1;
	if(R[num]<n)L[++num]=R[num]+1,R[num]=n;
	for(int i=1;i<=num;i++)
		for(int j=L[i];j<=R[i];j++)
			pos[j]=i,sum[i]+=a[j];
}
inline void update(int l,int r,int val){
	int x=pos[l],y=pos[y];
	if(x==y){
		for(int i=l;i<=r;i++)
			a[i]+=val;
		sum[x]+=(r-l+1)*val;
	}else{
		for(int i=x+1;i<y;i++)tag[i]+=val;//大段
		for(int i=l;i<=R[x];i++)a[i]+=val;//l~段
		for(int i=L[y];i<=r;i++)a[i]+=val;//段~r
		sum[x]+=(R[x]-l+1)*val;
		sum[y]+=(r-L[y]+1)*val;
	}
}
inline int query(int l,int r){
	int x=pos[l],y=pos[r],res=0;
	if(x==y){
		for(int i=l;i<=r;i++)res+=a[i];
		res+=tag[x]*(r-l+1);
	}else{
		for(int i=x+1;i<y;i++)res+=sum[i]+tag[i]*(R[i]-L[i]+1);
		for(int i=l;i<=R[x];i++)res+=a[i];
		for(int i=L[y];i<=r;i++)res+=a[i];
		res+=tag[x]*(R[x]-l+1)+tag[y]*(r-L[y]+1);
	}
	return res;
}
signed main(){
	cin.tie(0)->sync_with_stdio(0);
	int n,q,op,x,y,z;
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	init();
	while(q--){
		cin>>op>>x>>y;
		if(op==1)cin>>z,update(x,y,z);
		else cout<<query(x,y)<<"\n";
	}	
	return 0;
}
2025/1/11 10:53
加载中...