P4883 mzf的考验

维护一种数据结构 支持区间翻转 区间异或 区间求和…

显然 fhq treap

区间异或显然是拆位 然后复杂度*20

第一次先遍历一下整棵树 pushup 一下 就可以了不需要特意的用一个栈来pushup

注意下传懒标记,记得开 long long 就可以了 没了

  1. #include <bits/stdc++.h>
  2. using namespace std ;
  3. #define ls(x) t[x].ch[0]
  4. #define rs(x) t[x].ch[1]
  5. int read() {
  6. int x = 0 ; char c = getchar() ;
  7. while(c < '0' || c > '9') c = getchar() ;
  8. while(c >= '0' && c <= '9') { x = (x << 1) + (x << 3) + (c & 15) ; c = getchar() ; }
  9. return x ;
  10. }
  11. #define int long long
  12. void print(int x) {
  13. static char st[20] ; int stp = 0 ;
  14. if(! x) { putchar(48) ; }
  15. while(x) { st[++ stp] = x % 10 ^ 48 ; x /= 10 ; }
  16. while(stp) { putchar(st[stp --]) ; }
  17. putchar('\n') ;
  18. }
  19. const int MAXN = 1e5 + 10 ;
  20. struct Node { int val , rnd , sz , rev , tag , sum , ch[2] , bit[22] ; } ;
  21. Node t[MAXN] ;
  22. int n , m , rt = 0 , cnt = 0 ;
  23. void pushup(int o) {
  24. t[o].sz = t[ls(o)].sz + t[rs(o)].sz + 1 ; t[o].sum = t[ls(o)].sum + t[rs(o)].sum + t[o].val ;
  25. for(int i = 0 ; i <= 20 ; i ++) t[o].bit[i] = t[ls(o)].bit[i] + t[rs(o)].bit[i] + ((t[o].val >> i) & 1) ;
  26. }
  27. void swap(int & x , int & y) { x ^= y ^= x ^= y ; }
  28. void pushdown(int o) {
  29. if(t[o].rev) { swap(ls(o) , rs(o)) ; if(ls(o)) t[ls(o)].rev ^= 1 ; if(rs(o)) t[rs(o)].rev ^= 1 ; t[o].rev = 0 ; }
  30. if(t[o].tag) {
  31. if(ls(o)) {
  32. t[ls(o)].tag ^= t[o].tag ; t[ls(o)].sum = 0 ; t[ls(o)].val ^= t[o].tag ;
  33. for(int i = 0 ; i <= 20 ; i ++){
  34. if((t[o].tag >> i) & 1) t[ls(o)].bit[i] = t[ls(o)].sz - t[ls(o)].bit[i] ;
  35. t[ls(o)].sum += t[ls(o)].bit[i] << i ;
  36. }
  37. }
  38. if(rs(o)) {
  39. t[rs(o)].tag ^= t[o].tag ; t[rs(o)].sum = 0 ; t[rs(o)].val ^= t[o].tag ;
  40. for(int i = 0 ; i <= 20 ; i ++) {
  41. if((t[o].tag >> i) & 1) t[rs(o)].bit[i] = t[rs(o)].sz - t[rs(o)].bit[i] ;
  42. t[rs(o)].sum += t[rs(o)].bit[i] << i ;
  43. }
  44. }
  45. t[o].tag = 0 ;
  46. }
  47. }
  48. int merge(int u , int v) {
  49. if(! u || ! v) return u | v ;
  50. if(t[u].rnd < t[v].rnd) { pushdown(u) ; rs(u) = merge(rs(u) , v) ; pushup(u) ; return u ; }
  51. else { pushdown(v) ; ls(v) = merge(u , ls(v)) ; pushup(v) ; return v ; }
  52. }
  53. void split(int cur , int k , int & u , int & v) {
  54. if(! cur) { u = v = 0 ; return ; }
  55. pushdown(cur) ;
  56. if(k > t[ls(cur)].sz) { u = cur ; split(rs(u) , k - t[ls(u)].sz - 1 , rs(u) , v) ; }
  57. else { v = cur ; split(ls(v) , k , u , ls(v)) ; }
  58. pushup(cur) ;
  59. }
  60. void Reverse(int l , int r) {
  61. int x , y , z ;
  62. split(rt , r , x , z) ; split(x , l - 1 , x , y) ;
  63. t[y].rev ^= 1 ; rt = merge(merge(x , y) , z) ;
  64. }
  65. void Modify(int l , int r , int val) {
  66. int x , y , z ;
  67. split(rt , r , x , z) ; split(x , l - 1 , x , y) ;
  68. t[y].tag ^= val ; t[y].sum = 0 ; t[y].val ^= val ;
  69. for(int i = 0 ; i <= 20 ; i ++){
  70. if((val >> i) & 1) t[y].bit[i] = t[y].sz - t[y].bit[i] ;
  71. t[y].sum += t[y].bit[i] << i ;
  72. }
  73. rt = merge(merge(x , y) , z) ;
  74. }
  75. int Query(int l , int r) {
  76. int x , y , z ;
  77. split(rt , r , x , z) ; split(x , l - 1 , x , y) ;
  78. int res = t[y].sum ; rt = merge(merge(x , y) , z) ;
  79. return res ;
  80. }
  81. int NewNode(int val) {
  82. ++ cnt ;
  83. t[cnt].ch[0] = t[cnt].ch[1] = 0 ; t[cnt].val = val ; t[cnt].rnd = rand() ; t[cnt].sz = 1 ;
  84. t[cnt].rev = t[cnt].tag = t[cnt].sum = 0 ;
  85. return cnt ;
  86. }
  87. void Insert(int val) { rt = merge(rt , NewNode(val)) ; }
  88. void build(int x) { if(ls(x)) build(ls(x)) ; if(rs(x)) build(rs(x)) ; pushup(x) ; }
  89. signed main() {
  90. srand(19260817) ;
  91. n = read() ; m = read() ;
  92. for(int i = 1 ; i <= n ; i ++) Insert(read()) ;
  93. build(rt) ;
  94. while(m --) {
  95. int opt = read() ;
  96. if(opt == 1) { int l = read() , r = read() ; Reverse(l , r) ; }
  97. if(opt == 2) { int l = read() , r = read() , val = read() ; Modify(l , r , val) ; }
  98. if(opt == 3) { int l = read() , r = read() ; print(Query(l , r)) ; }
  99. }
  100. return 0 ;
  101. }

P4883 mzf的考验[平衡树]的更多相关文章

  1. 洛谷 P4883 mzf的考验 解题报告

    P4883 mzf的考验 题目背景 \(mzf\)立志要成为一个豪杰,当然,他也是一个\(OIer\). 他希望自己除了会\(OI\)之外还会各种东西,比如心理学.吉他.把妹等等. 为了让自己有更大的 ...

  2. 【洛谷】P4883 mzf的考验

    [洛谷]P4883 mzf的考验 最近忽然放弃治疗开始随机跳题了 感觉还行 就是必须吸氧感觉有点糟糕... 这题翻转和求和都是平衡树基本操作,那个异或可以通过维护树中\(2\)进制下第\(2^{i}\ ...

  3. 洛谷【P4883】mzf的考验

    浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

  4. mzf的考验

    题解: 比较水吧 显然是平衡树的操作 然后就是写写写 用对拍来查错相比之下直接样例查还是比较容易的 刚开始没有优化常数没开O2就变成暴力分了smg 开了O2就a了 代码: #include <b ...

  5. luogu4883 mzf的考验

    题目描述: luogu 题解: 当然splay. 区间翻转是基本操作. 区间异或?按套路记录区间内每一位$1$的个数,异或的时候按位取反即可. 区间查询同理. 因为要按位维护,所以复杂度多了个log. ...

  6. [BZOJ3223]Tyvj 1729 文艺平衡树

    [BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...

  7. [BZOJ3224]Tyvj 1728 普通平衡树

    [BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...

  8. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Sta ...

  9. [普通平衡树treap]【学习笔记】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9046  Solved: 3840[Submit][Sta ...

随机推荐

  1. (五)myBatis架构以及SQlSessionFactory,SqlSession,通过代理执行crud源码分析---待更

    MyBatis架构 首先MyBatis大致上可以分为四层: 1.接口层:这个比较容易理解,就是指MyBatis暴露给我们的各种方法,配置,可以理解为你import进来的各种类.,告诉用户你可以干什么 ...

  2. 利用Kubernetes中的leaderelection实现组件高可用

    在Kubernetes中,通常kube-schduler和kube-controller-manager都是多副本进行部署的来保证高可用,而真正在工作的实例其实只有一个.这里就利用到 leaderel ...

  3. Java并发编程(三):ReentrantLock

    ReentrantLock是可以用来代替synchronized的.ReentrantLock比synchronized更加灵活,功能上面更加丰富,性能方面自synchronized优化后两者性能没有 ...

  4. LNK2019

    原因:inline函数被外部文件的函数调用时,必须将inline函数定义在头文件中,不能定义在cpp文件中.

  5. js引入,js变量和运算符等

    页面级的js不管写在页面的哪里都可以 企业项目开发要求:结构(html),样式(css),行为(js)相分离 不要既写外部js,又写内部js:如果两个都写,则外部js生效 声明多个变量时,每个变量之间 ...

  6. 什么是JWT以及具体应用

    jwt理论阮大神已经解释的很到位了 http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html jwt官网收录了多种实现库, ...

  7. 制作openstack的windows server 2012r2镜像

    1. 基础环境安装 yum groupinstall Virtualization "Virtualization Client" yum install libvirt 2. 启 ...

  8. zabbix-server配置文件详解

    zabbix官方文档:https://www.zabbix.com/documentation/4.0/zh/manual zabbix-server端的配置文件在/etc/zabbix/zabbix ...

  9. 珠峰-express

    ##### #### 中间件的作用 #### 自己写的Route方法 #### #### 中间件

  10. MySQL常用关键词

    MySQL常用关键词 1.  显示表departments的结构:DESC DESC departments; 2. 显示出表employees中的全部job_id(不能重复):DISTINCT SE ...