用分块写的WA求调
查看原帖
用分块写的WA求调
757490
Aamumatematiikka楼主2023/11/18 14:47
#include <iostream>
#include <cmath>
#define ll long long
using namespace std;
ll n, q, a[200005], t, sum[455], pl[455], pr[455], add[455], pos[200005];
int main(){
	scanf("%lld%lld",&n,&q);
	for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
	t=sqrt(n);
	for(ll i=1;i<=n;i++) pos[i]=(i-1)/t+1;
	for(ll i=1;i<=t;i++){
		pr[i]=(pl[i]=pr[i-1]+1)+t-1, add[i]=0;
		for(ll j=pl[i];j<=pr[i];j++) sum[i]+=a[j];
	}
	if(t*t<n){
		pr[++t]=(pl[t]=pr[t-1]+1)+t-2, add[t]=0;
		for(ll i=pl[t];i<=pr[t];i++) sum[t]+=a[i];
	}
	while(q--){
		ll op, l, r, k;
		scanf("%lld",&op);
		if(op==1){
			scanf("%lld%lld%lld",&l,&r,&k);
			for(ll i=1;i<=t;i++){
				if(l<=pl[i]&&pr[i]<=r) sum[i]+=(pr[i]-pl[i]+1)*k, add[i]+=k;
				else if(pl[i]>r||pr[i]<l) continue;
				else for(ll j=pl[i];j<=pr[i];j++) if(l<=j&&j<=r) a[j]+=k, sum[pos[j]]+=k;
			}
		}else if(op==2){
			scanf("%lld%lld",&l,&r);
			ll ans=0;
			for(ll i=1;i<=t;i++){
				if(l<=pl[i]&&pr[i]<=r) ans+=sum[i];
				else if(pl[i]>r||pr[i]<l) continue;
				else for(ll j=pl[i];j<=pr[i];j++) if(l<=j&&j<=r) ans+=a[j]+add[pos[j]];
			}
			printf("%lld\n",ans);
		}
	}
	return 0;
}
2023/11/18 14:47
加载中...