SP11470 TTM - To the moon

  • C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1。

  • Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的和 。

  • H l r t:查询时间戳 \(t\) 区间 \([L,R]\) 的和 。

  • B t:将当前时间戳置为 \(t\)

每次记下版本 \(times\)

保留标记…每次标记的时候直接加上\(tag_p\) 即可

  1. #include <bits/stdc++.h>
  2. #define ls(x) ch[x][0]
  3. #define rs(x) ch[x][1]
  4. #define rep(i , j , k) for(int i = j ; i <= k ; i ++)
  5. #define Rep(i , j , k) for(int i = j ; i >= k ; i --)
  6. using namespace std ;
  7. using ll = long long ;
  8. using pii = pair <int , int> ;
  9. using vii = vector <int> ;
  10. #define int long long
  11. auto ot = [&]() { cerr << "ATS TXDY" << '\n' ; int ATS_nantf_txdy = true ; } ;
  12. auto _ios = [&]() { ios :: sync_with_stdio(false) ; cin.tie(nullptr) ; cout.tie(nullptr) ; } ;
  13. namespace stO_ATS_Orz {
  14. template < class T > void cmax(T & x , T y) { if(x < y) x = y ; }
  15. template < class T > void cmin(T & x , T y) { if(x > y) x = y ; }
  16. template < class T > void abs(T x) { if(x < 0) x = -x ; }
  17. const int N = 1e5 + 10 ;
  18. int n , m ;
  19. int a[N] , cnt = 0 ;
  20. int rt[N] , tag[N * 50] , sum[N * 50] ;
  21. int ls[N * 50] , rs[N * 50] ;
  22. void build(int l , int r , int & p) {
  23. p = ++ cnt ;
  24. if(l == r) { sum[p] = a[l] ; return ; }
  25. int mid = l + r >> 1 ;
  26. build(l , mid , ls[p]) ;
  27. build(mid + 1 , r , rs[p]) ;
  28. sum[p] = sum[ls[p]] + sum[rs[p]] ;
  29. }
  30. void change(int a , int b , int l , int r , int pre , int & p , int val) {
  31. tag[p = ++ cnt] = tag[pre] ; sum[p] = sum[pre] + 1ll * (min(b , r) - max(a , l) + 1) * val ;
  32. if(a <= l && r <= b) { tag[p] += val ; ls[p] = ls[pre] ; rs[p] = rs[pre] ; return ; }
  33. int mid = l + r >> 1 ;
  34. if(a <= mid) change(a , b , l , mid , ls[pre] , ls[p] , val) ;
  35. else ls[p] = ls[pre] ;
  36. if(b > mid) change(a , b , mid + 1 , r , rs[pre] , rs[p] , val) ;
  37. else rs[p] = rs[pre] ;
  38. }
  39. int query(int a , int b , int l , int r , int p) {
  40. if(a <= l && r <= b) { return sum[p] ; }
  41. int mid = l + r >> 1 , ans = 0 ;
  42. if(a <= mid) ans += query(a , b , l , mid , ls[p]) ;
  43. if(b > mid) ans += query(a , b , mid + 1 , r , rs[p]) ;
  44. ans += 1ll * tag[p] * (min(b , r) - max(a , l) + 1) ;
  45. return ans ;
  46. }
  47. void main() {
  48. cin >> n >> m ; rep(i , 1 , n) cin >> a[i] ;
  49. build(1 , n , rt[0]) ;
  50. int times = 0 ;
  51. rep(i , 1 , m) {
  52. char c ; cin >> c ;
  53. if(c == 'C') {
  54. int l , r , d ;
  55. cin >> l >> r >> d ; times ++ ;
  56. change(l , r , 1 , n , rt[times - 1] , rt[times] , d) ;
  57. }
  58. if(c == 'Q') {
  59. int l , r ; cin >> l >> r ;
  60. cout << query(l , r , 1 , n , rt[times]) << '\n' ;
  61. }
  62. if(c == 'H') {
  63. int l , r , t ; cin >> l >> r >> t ;
  64. cout << query(l , r , 1 , n , rt[t]) << '\n' ;
  65. }
  66. if(c == 'B') {
  67. int t ; cin >> t ; times = t ;
  68. }
  69. }
  70. }
  71. }
  72. signed main() {
  73. _ios() ; ot() ;
  74. return stO_ATS_Orz :: main() , 0 ;
  75. }

SP11470 TTM - To the moon[主席树标记永久化]的更多相关文章

  1. [HDU4348]To the moon(主席树+标记永久化)

    学可持久化treap的时候才发现自己竟然没写过需要标记下传的主席树,然而现在发现大部分操作都可以标记永久化,下传会增大占用空间. 这题一种写法是和普通的线段树一样标记下传,注意所有修改操作(包括put ...

  2. Codeforces 258E - Little Elephant and Tree(根号暴力/线段树+标记永久化/主席树+标记永久化/普通线段树/可撤销线段树,hot tea)

    Codeforces 题目传送门 & 洛谷题目传送门 yyq:"hot tea 不常有,做过了就不能再错过了" 似乎这是半年前某场 hb 模拟赛的 T2?当时 ycx.ym ...

  3. [HNOI2015]开店(树剖+主席树+标记永久化)

    听说正解点分树?我不会就对了 此题是 \([LNOI2014]LCA\) 强化版,也是差分一下,转化为区间加区间和 不过权值有大小要求,那么我们按照权值排序,依次加入主席树,询问的时候 \(lower ...

  4. HDU 4348(主席树 标记永久化)

    题面一看就是裸的数据结构题,而且一看就知道是主席树... 一共四种操作:1:把区间[l, r]的数都加上d,并且更新时间.2:查询当前时间的区间和.3:查询历史时间的区间和.4:时光倒流到某个时间. ...

  5. hdu4348区间更新的主席树+标记永久化

    http://acm.hdu.edu.cn/showproblem.php?pid=4348 sb的标记永久化即可,刚开始add和sum没复制过来wa了两发...,操作和原来的都一样,出来单点变成区间 ...

  6. BZOJ4785 [Zjoi2017]树状数组 【二维线段树 + 标记永久化】

    题目链接 BZOJ4785 题解 肝了一个下午QAQ没写过二维线段树还是很难受 首先题目中的树状数组实际维护的是后缀和,这一点凭分析或经验或手模观察可以得出 在\(\mod 2\)意义下,我们实际求出 ...

  7. hdu4348 To the moon (主席树 || 离线线段树)

    Problem Description Background To The Moon is a independent game released in November 2011, it is a ...

  8. SP11470 TTM - To the moon

    嘟嘟嘟 主席树+区间修改. 以为是水题,写着写着发现区间修改标记下传会出问题,然后想了想发现以前做的只是单点修改. 那怎么办咧? 然后题解交了我标记永久化这个神奇的东西. 特别好理解,就是修改的时候直 ...

  9. hdu 4348 To the moon (主席树区间更新)

    传送门 题意: 一个长度为n的数组,4种操作 : (1)C l r d:区间[l,r]中的数都加1,同时当前的时间戳加1 . (2)Q l r:查询当前时间戳区间[l,r]中所有数的和 . (3)H ...

随机推荐

  1. 并发队列之PriorityBlockingQueue

    这一篇说一下PriorityBlockingQueue,引用书中的一句话:这就是带优先级的无界阻塞队列,每次出队都返回优先级最高或者最低的元素(这里规则可以自己制定),内部是使用平衡二叉树实现的,遍历 ...

  2. 开源虚拟机Bochs安装以及踩坑

    因为想要写一个简单的操作系统,所以需要安装虚拟机来模拟出硬件,VMware不适合这个场景,因为会使用硬件级别的虚拟化,而bochs这个开源虚拟机,是用软件虚拟了所有的硬件,所以调试可以做到非常细的粒度 ...

  3. bjut校园网自动登录

    主要是懒得每次上网都需要打开网页=.= logon.bat @echo off mode con: cols=40 lines=15 color 0a title 登录ing... rem 获得IP ...

  4. 浅谈二分—— by hyl天梦

    二分 解决范围 二分法可以用来解决这一系列具有单调性质的题,例如求单调函数的零点 其实在小学奥数中就用到了二分法 例如手动开根号,再比如猜数游戏 二分的具体过程就是先取一个中间值,判定一下正确答案在哪 ...

  5. Codeforces_846

    A.简单dp. #include<bits/stdc++.h> using namespace std; ],dp[][] = {}; int main() { ios::sync_wit ...

  6. Codeforces_723

    A.取中间那个点即可. #include<bits/stdc++.h> using namespace std; ]; int main() { ios::sync_with_stdio( ...

  7. html标签学习入门 随笔

    Html学习入门    随笔1: HTML 标题 HTML 标题(Heading)是通过 <h1> - <h6> 等标签进行定义的. 标题仅用于标题文本  不应该被使用在加粗字 ...

  8. Hapi+MySql项目实战数据库操作(四)

    数据库访问 下面以Node的ORM框架Sequelize来操作数据库,Mysql为例. 配置数据库连接信息config/db_config.js: //db_config.js module.expo ...

  9. 各类JWT库(java)的使用与评价

    [搬运工] 出处:http://andaily.com/blog/?p=956 在 https://jwt.io/ 网站中收录有各类语言的JWT库实现(有关JWT详细介绍请访问 https://jwt ...

  10. Xcode如何集成Pod教程

    一般开发都会用到很多第三方的框架,利用好他们可以加快开发进度,为了更方便将第三方的框架集成到我们的项目中,Pod是个很好的选择,现在说一下该怎么将Pod集成到我们的Xcode中 第一种方法 命令行的方 ...