zoukankan      html  css  js  c++  java
  • 【HDOJ】4348 To the moon

    主席树区间更新,延迟标记。

      1 /* 4348 */
      2 #include <iostream>
      3 #include <sstream>
      4 #include <string>
      5 #include <map>
      6 #include <queue>
      7 #include <set>
      8 #include <stack>
      9 #include <vector>
     10 #include <deque>
     11 #include <algorithm>
     12 #include <cstdio>
     13 #include <cmath>
     14 #include <ctime>
     15 #include <cstring>
     16 #include <climits>
     17 #include <cctype>
     18 #include <cassert>
     19 #include <functional>
     20 #include <iterator>
     21 #include <iomanip>
     22 using namespace std;
     23 //#pragma comment(linker,"/STACK:102400000,1024000")
     24 
     25 #define sti                set<int>
     26 #define stpii            set<pair<int, int> >
     27 #define mpii            map<int,int>
     28 #define vi                vector<int>
     29 #define pii                pair<int,int>
     30 #define vpii            vector<pair<int,int> >
     31 #define rep(i, a, n)     for (int i=a;i<n;++i)
     32 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
     33 #define clr                clear
     34 #define pb                 push_back
     35 #define mp                 make_pair
     36 #define fir                first
     37 #define sec                second
     38 #define all(x)             (x).begin(),(x).end()
     39 #define SZ(x)             ((int)(x).size())
     40 // #define lson            l, mid, rt<<1
     41 // #define rson            mid+1, r, rt<<1|1
     42 
     43 const int maxn = 1e5+5;
     44 const int maxm = 5e6+5;
     45 int T[maxn];
     46 int lson[maxm], rson[maxm];
     47 __int64 sum[maxm], delta[maxm];
     48 int a[maxn];
     49 int tot, n, q;
     50 
     51 inline void PushUp(int rt) {
     52     sum[rt] = sum[lson[rt]] + sum[rson[rt]];
     53 }
     54 
     55 void init() {
     56     tot = 0;
     57 }
     58 
     59 int Build(int l, int r) {
     60     int rt = tot++;
     61     delta[rt] = 0;
     62     
     63     if (l == r) {
     64         sum[rt] = a[l];
     65         return rt;
     66     }
     67     
     68     int mid = (l + r) >> 1;
     69     
     70     lson[rt] = Build(l, mid);
     71     rson[rt] = Build(mid+1, r);
     72     
     73     PushUp(rt);
     74     return rt;
     75 }
     76 
     77 void copy(int d, int s) {
     78     lson[d] = lson[s];
     79     rson[d] = rson[s];
     80     delta[d] = delta[s];
     81     sum[d] = sum[s];
     82 }
     83 
     84 int Update(int rt, int L, int R, int val, int l, int r) {
     85     int nrt = tot++;
     86     
     87     copy(nrt, rt);
     88     sum[nrt] += 1LL * val * (R - L + 1);
     89     if (L==l && R==r) {
     90         delta[nrt] += val;
     91         return nrt;
     92     }
     93     
     94     int mid = (l + r) >> 1;
     95     
     96     if (R <= mid) {
     97         lson[nrt] = Update(lson[rt], L, R, val, l, mid);
     98     } else if (L > mid) {
     99         rson[nrt] = Update(rson[rt], L, R, val, mid+1, r);
    100     } else {
    101         lson[nrt] = Update(lson[rt], L, mid, val, l, mid);
    102         rson[nrt] = Update(rson[rt], mid+1, R, val, mid+1, r);
    103     }
    104     
    105     return nrt;
    106 }
    107 
    108 __int64 Query(int rt, int L, int R, int l, int r) {
    109     if (L==l && R==r)  {
    110         return sum[rt];
    111     }
    112     
    113     int mid = (l + r) >> 1;
    114     __int64 ret = 1LL * (R-L+1) * delta[rt];
    115     
    116     if (R <= mid) {
    117         ret += Query(lson[rt], L, R, l, mid);
    118     } else if (L > mid) {
    119         ret += Query(rson[rt], L, R, mid+1, r);
    120     } else {
    121         ret += Query(lson[rt], L, mid, l, mid);
    122         ret += Query(rson[rt], mid+1, R, mid+1, r);
    123     }
    124     
    125     return ret;
    126 }
    127 
    128 void solve() {
    129     int cur = 0;
    130     char op[4];
    131     int l, r, d, t;
    132     __int64 ans;
    133     
    134     init();
    135     T[0] = Build(1, n);
    136     while (q--) {
    137         scanf("%s", op);
    138         if (op[0] == 'B') {
    139             scanf("%d", &cur);
    140         } else if (op[0] == 'Q') {
    141             scanf("%d %d", &l, &r);
    142             t = cur;
    143             ans = Query(T[t], l, r, 1, n);
    144             printf("%I64d
    ", ans);
    145         } else if (op[0] == 'H') {
    146             scanf("%d %d %d", &l, &r, &t);
    147             ans = Query(T[t], l, r, 1, n);
    148             printf("%I64d
    ", ans);
    149         } else {
    150             scanf("%d %d %d", &l, &r, &d);
    151             T[cur+1] = Update(T[cur], l, r, d, 1, n);
    152             ++cur;
    153         }
    154     }
    155 }
    156 
    157 int main() {
    158     ios::sync_with_stdio(false);
    159     #ifndef ONLINE_JUDGE
    160         freopen("data.in", "r", stdin);
    161         freopen("data.out", "w", stdout);
    162     #endif
    163     
    164     while (scanf("%d %d", &n, &q)!=EOF) {
    165         rep(i, 1, n+1)
    166             scanf("%d", &a[i]);
    167         solve();
    168     }
    169     
    170     #ifndef ONLINE_JUDGE
    171         printf("time = %d.
    ", (int)clock());
    172     #endif
    173     
    174     return 0;
    175 }



  • 相关阅读:
    开源 Serverless 里程碑:Knative 1.0 来了
    以一致的体验交付和管理云原生多集群应用
    iLogtail使用入门K8S环境日志采集到SLS
    如何在golang代码里面解析容器镜像
    mac vmware 无法复制粘贴
    使用vi编辑时上下左右方向键被转化为A、B、C、D
    left join 和 left outer join 的区别
    设计模式之 适配器模式
    设计模式之 命令模式
    设计模式学习之 策略模式
  • 原文地址:https://www.cnblogs.com/bombe1013/p/5188154.html
Copyright © 2011-2022 走看看