20pts WA#1-#20 求条
  • 板块P2357 守墓人
  • 楼主GavinCQTD
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/11/25 16:48
  • 上次更新2024/11/25 19:49:58
查看原帖
20pts WA#1-#20 求条
770431
GavinCQTD楼主2024/11/25 16:48
/******************************
  @GavinCQTD / 2024-11-25 16:40:45
  "P2357 守墓人" From Luogu
  # https://www.luogu.com.cn/problem/P2357?contestId=215426
  1000 ms / 128 MB
******************************/
/* We all make choices, but in the end our choices make us. */

// #pragma GCC optimize(1,2,3,"Ofast","inline")

#include <iostream>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <assert.h>
using namespace std;
inline void pass(){return;}
inline void hold(){while(1);}
#define endl "\n"
#define mp(a,b) make_pair(a,b)
#define ct(a) while(!a.empty()) a.pop()
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
#define cdb cerr<<"Debug: "
#define cwn cerr<<"Warn: "
#define debug(x) cerr<<"In Line "<<__LINE__<<": "<<#x<<" = "<<x<<"\n"
#define sp(a) fixed<<setprecision(a)
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#define ll long long
#define ull unsigned long long
#define ld long double
#define int ll
// #define _debug

int _t,n,m,a[200005],tree[800005],lzy[800005];

inline void pushup(int u){tree[u]=tree[u*2]+tree[u*2+1];}

void build(int u,int l,int r){
    if(l==r){
        tree[u] = a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(u*2,l,mid);
    build(u*2+1,mid+1,r);
    pushup(u);
}

inline bool inrange(int l,int r,int ql,int qr){return (ql<=l)&&(r<=qr);}
inline bool outofrange(int l,int r,int ql,int qr){return (l>qr)||(r<ql);}

inline void maketag(int u,int ul,int ur,int uk){
    lzy[u] += uk;
    tree[u] += (ur-ul+1)*uk;
}
inline void pushdown(int u,int ul,int ur){
    int mid=(ul+ur)>>1;
    maketag(u*2,ul,mid,lzy[u]);
    maketag(u*2+1,mid+1,ur,lzy[u]);
    lzy[u] = 0;
}

int query(int u,int l,int r,int ql,int qr){
    if(inrange(l,r,ql,qr)) return tree[u];
    else if(!outofrange(l,r,ql,qr)){
        int mid=(l+r)>>1;
        pushdown(u,l,r);
        return query(u*2,l,mid,ql,qr)+query(u*2+1,mid+1,r,ql,qr);
    }
    else return 0;
}

void update(int u,int l,int r,int ul,int ur,int uk){
    if(inrange(l,r,ul,ur)) maketag(u,l,r,uk);
    else if(!outofrange(l,r,ul,ur)){
        int mid=(l+r)>>1;
        pushdown(u,l,r);
        update(u*2,l,mid,ul,ur,uk);
        update(u*2+1,mid+1,r,ul,ur,uk);
        pushup(u);
    }
}

void solve(int testID){
    cin >> n >> m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int op;
        cin >> op;
        if(op==1){
            int l,r,k;
            cin >> l >> r >> k;
            update(1,1,n,l,r,k);
        }
        else if(op==2){
            int k;
            cin >> k;
            update(1,1,1,1,1,k);
        }
        else if(op==3){
            int k;
            cin >> k;
            update(1,1,1,1,1,-k);
        }
        else if(op==4){
            int l,r;
            cin >> l >> r;
            cout << query(1,1,n,l,r) << "\n";
        }
        else{
            cout << query(1,1,n,1,1) << "\n";
        }
    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    // freopen(".in", "r", stdin);
    // freopen(".out", "w", stdout);
    // freopen("PublicDebug.debug", "w", stderr);

    // cout << sp();
    // cerr << sp();

    _t = 1;
    // cin >> _t;

    for(int ran=0;ran<_t;ran++) solve(ran);

    fflush(stdout);
    return 0;
}
2024/11/25 16:48
加载中...