20pts求调,悬一关
  • 板块P2357 守墓人
  • 楼主lostxxx
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/14 20:38
  • 上次更新2024/7/14 22:23:12
查看原帖
20pts求调,悬一关
951050
lostxxx楼主2024/7/14 20:38

代码如下

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
    ll lazy,sum;
    ll l,r;
}block[200100];
ll vis[200100];
ll n,f;
ll a[200100];
ll len;
ll opt,l,r,k;
ll blocks=1,times=0;
int main(){
    cin>>n>>f;
    len=sqrt(n);
    for (int i=1;i<=n;i++){
        times++;
        vis[i]=blocks;
        if (times>=len){
            blocks++;
            times=0;
        }
    }
    for (int i=1;i<=n;i++){
        cin>>a[i];
        block[vis[i]].sum+=a[i];
    }
    for (int i=1;i<=2e5;i++){
        block[i].l=2e5;
        block[i].r=2e5;
    }
    for (int i=1;i<=n;i+=len){
        block[vis[i]].l=i;
        block[vis[i]].r=i+len-1;
        //cout<<block[vis[i]].l<<" "<<block[vis[i]].r<<endl;
    }
    block[vis[n]].l=(vis[n]-1)*len+1;
    block[vis[n]].r=vis[n]*len;
    while(f--){
        cin>>opt;
        if (opt==1){
            cin>>l>>r>>k;
            ll L=vis[l];
            ll R=vis[r];
            if ((l-1)%len!=0)
                L++;
            if (r%len!=0)
                R--;
            for (int i=L;i<=R;i++){
                block[i].lazy+=k;
                //cout<<i<<endl;
            }
            for (int i=l;i<=block[L-1].r;i++){
                a[i]+=k;
                block[L-1].sum+=k;
                //cout<<"???2\n";
            }
            for (int i=block[R+1].l;i<=r;i++){
                a[i]+=k;
                block[R+1].sum+=k;
                //cout<<"???1\n";
            }
        }else if (opt==2){
            cin>>k;
            a[1]+=k;
            block[1].sum+=k;
        }else if (opt==3){
            cin>>k;
            a[1]-=k;
            block[1].sum-=k;
        }else if (opt==4){
            cin>>l>>r;
            ll L=vis[l];
            ll R=vis[r];
            if ((l-1)%len!=0)
                L++;
            if (r%len!=0)
                R--;
            ll ans=0;
            for (int i=L;i<=R;i++){
                ans+=block[i].sum;
                ans+=len*block[i].lazy;
            }
            for (int i=l;i<=block[L-1].r;i++){
                ans+=a[i];
                ans+=block[L-1].lazy;
            }
            for (int i=block[R+1].l;i<=r;i++){
                ans+=a[i];
                ans+=block[R+1].lazy;
            }
            cout<<ans<<endl;
        }else if (opt==5){
            cout<<a[1]+block[1].lazy<<endl;
        }
        // for (int i=1;i<=n;i++)
        //     cout<<a[i]+block[vis[i]].lazy<<" ";
        // cout<<endl;
    }
}
2024/7/14 20:38
加载中...