萌新求助 分块91
查看原帖
萌新求助 分块91
371927
REAL_曼巴楼主2023/3/27 12:56

wa on3

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+7;
struct node{
    int l,r;
    int sum,lazy;
};
node block[maxn];
int a[maxn];
int b[maxn];
int id[maxn];
void update(int l,int r,int k){
    if(id[l]==id[r]){
        for(int i=l;i<=r;++i)a[i]+=k,block[id[i]].sum+=k;
        return ;
    }
    for(int i=l;i<=block[id[l]].r;i++)a[i]+=k,block[id[i]].sum+=k;//两边零碎的
	for(int i=block[id[r]].l;i<=r;i++)a[i]+=k,block[id[i]].sum+=k;
	for(int i=id[l]+1;i<id[r];i++)block[i].lazy+=k;//整块的
    return ;
}
int query(int l,int r){
    int ans=0;
    if(id[l]==id[r]){
        for(int i=l;i<=r;++i)ans+=a[i]+block[id[i]].lazy;
        return ans;
    }
    for(int i=l;i<=block[id[l]].r;i++)ans+=a[i]+block[id[i]].lazy;
	for(int i=block[id[r]].l;i<=r;i++)ans+=a[i]+block[id[i]].lazy;
	for(int i=id[l]+1;i<id[r];i++)ans+=block[i].sum+(block[i].r-block[i].l+1)*block[i].lazy;
    return ans;
} 
signed main(){
	int n,q;
    cin>>n>>q;
    int block_size=sqrt(n);
    for(int i=1;i<=n;++i)cin>>b[i];
    for(int i=1;i<=n;++i)a[i]=b[i]-b[i-1];
    for(int i=1;i<=n;++i){
        id[i]=(i+block_size-1)/block_size;
        block[id[i]].sum+=a[i];
    }
    for(int i=1;i<=id[n];++i){
        block[i].r=block_size*i;
        block[i].l=block[i-1].r+1;
    }
    block[id[n]].r=min(block[id[n]].r,n);
    while(q--){
        int op,l,r,k;
        cin>>op;
        if(op==1){
			int l,r,k,d;
			cin>>l>>r>>k>>d;
			update(l,l,k);
			if(l+1<=n)update(l+1,r,d);
			if(r+1<=n)update(r+1,r+1,-((r-l)*d+k));
		}
		else{
			int x;
			cin>>x;
			cout<<query(1,x)<<endl;
		}
    }
	return 0;
}
2023/3/27 12:56
加载中...