题目链接

BZOJ5312: 冒险

题解

如果一次操作对区间& 和 区间| 产生的影响是相同的,那么该操作对整个区间的影响都是相同的

对于每次操作,在某些位上的值,对于整个区间影响是相同的,对相同影响的操作直接打标记

否则递归子树

复杂度证明:

https://csacademy.com/contest/round-70/task/and-or-max/solution/

代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. inline int read() {
  4. int x = 0,f = 1;
  5. char c = getchar();
  6. while(c < '0' || c > '9'){if(c == '-')f = -1; c = getchar(); }
  7. while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar();
  8. return x *f ;
  9. } const int maxn = 2000007;
  10. int n,a[maxn],m;
  11. int A[maxn << 1],O[maxn << 1],t[maxn << 1],tag[maxn];
  12. #define ls x << 1
  13. #define rs x << 1 | 1
  14. inline void update(int x) {
  15. A[x] = A[ls] & A[rs];
  16. O[x] = O[ls] | O[rs];
  17. t[x] = std::max(t[ls],t[rs]);
  18. }
  19. inline void ps(int x,int k ) { tag[x] += k; A[x] += k; O[x] += k; t[x] += k; }
  20. void pushdown(int x) {
  21. ps(ls,tag[x]);
  22. ps(rs,tag[x]);
  23. tag[x] = 0;
  24. return;
  25. }
  26. void build(int x,int l,int r) {
  27. if(l == r) {
  28. A[x] = O[x] = t[x] = a[l];
  29. return ;
  30. }
  31. int mid = l + r >> 1;
  32. build(x << 1,l,mid); build(x << 1 | 1,mid + 1,r);
  33. update(x);
  34. }
  35. void modify(int x,int l,int r,int L,int R,int k,int type) {
  36. bool t = false;
  37. if(type == 1) {
  38. if((O[x] & k) == O[x]) return;
  39. t = ((A[x] & k) - A[x] == (O[x] & k) - O[x]);
  40. } else {
  41. if((A[x] | k) == A[x]) return;
  42. t = ((A[x] | k) - A[x] == (O[x] | k) - O[x]);
  43. }
  44. if(l >= L && r <= R && t) {
  45. if(type == 1) ps(x,(A[x] & k) - A[x]);
  46. else ps(x, (O[x] | k) - O[x]);
  47. return;
  48. }
  49. if(tag[x]) pushdown(x);
  50. int mid = l + r >> 1;
  51. if(L <= mid) modify(ls,l,mid,L,R,k,type);
  52. if(R > mid) modify(rs,mid + 1,r,L,R,k,type);
  53. update(x);
  54. }
  55. int query(int x,int l,int r,int L ,int R) {
  56. if(l >= L && r <= R) return t[x];
  57. int ret = 0;
  58. if(tag[x]) pushdown(x);
  59. int mid = l + r >> 1;
  60. if(L <= mid) ret = std::max(ret,query(ls,l,mid,L,R));
  61. if(R > mid) ret = std::max(ret,query(rs,mid + 1,r,L,R));
  62. return ret;
  63. }
  64. int main() {
  65. n = read(); m = read();
  66. for(int i = 1;i <= n;++ i) a[i] = read();
  67. build(1,1,n);
  68. for(int i = 1;i <= m;i += 1) {
  69. int type = read(),l = read(),r = read();
  70. if(type == 1) {
  71. int x = read();
  72. modify(1,1,n,l,r,x,type);
  73. } else if(type == 2) {
  74. int x = read();
  75. modify(1,1,n,l,r,x,type);
  76. } else
  77. printf("%d\n",query(1,1,n,l,r));
  78. }
  79. return 0;
  80. }

bzoj5312: 冒险(势能均摊线段树)的更多相关文章

  1. BZOJ5312 冒险 势能分析、线段树

    传送门 区间位赋值.区间求最大值似乎是不能够像一般的线段树一样直接打标记的,但是直接暴力也太没有面子了. 我们考虑优化一下暴力:如果说线段树的一段区间内在当前修改的所有位置上所有数都是相同的,那么这个 ...

  2. bzoj5312 冒险(吉司机线段树)题解

    题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 按位与\(x\) \(2.\)区间\([L,R]\) 按位或\(x\) \(3.\)区间\([L,R]\) 询问最大值 ...

  3. 洛谷 P6783 - [Ynoi2008] rrusq(KDT+势能均摊+根号平衡)

    洛谷题面传送门 首先显然原问题严格强于区间数颜色,因此考虑将询问离线下来然后用某些根号级别复杂度的数据结构.按照数颜色题目的套路,我们肯定要对于每种颜色维护一个前驱 \(pre\),那么答案可写作 \ ...

  4. 【LOJ#6029】市场(线段树)

    [LOJ#6029]市场(线段树) 题面 LOJ 题解 看着就是一个需要势能分析的线段树. 不难发现就是把第二个整除操作化为减法. 考虑一下什么时候整除操作才能变成减法. 假设两个数为\(a,b\). ...

  5. 【洛谷3822】[NOI2017] 整数(线段树压位)

    题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...

  6. POJ 3468 A Simple Problem with Integers(线段树区间更新)

    题目地址:POJ 3468 打了个篮球回来果然神经有点冲动. . 无脑的狂交了8次WA..竟然是更新的时候把r-l写成了l-r... 这题就是区间更新裸题. 区间更新就是加一个lazy标记,延迟标记, ...

  7. BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...

  8. BZOJ5312 冒险(势能线段树)

    BZOJ题目传送门 表示蒟蒻并不能一眼看出来这是个势能线段树. 不过仔细想想也并非难以理解,感性理解一下,在一个区间里又与又或,那么本来不相同的位也会渐渐相同,线段树每个叶子节点最多修改\(\log ...

  9. 【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析

    题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之 ...

随机推荐

  1. CEdit使用(Edit Control控件)

    CEdit使用(Edit Control控件) 编辑框只读 属性 Read Only等于 True,就有了只读效果 密码框 属性 Password 等于 True,就有了密码效果 获取值/赋予值 Up ...

  2. ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Memory Type and Attributes

    1.前言 2. Memory类型和属性 memory分为normal memory和device memory,两种类型的Memory有各自的属性,除了下面介绍的几种属性外,还有其他一些杂项属性 2. ...

  3. 【转】SourceInsight4破解笔记

    时隔好多年,sourceinsight4以迅雷不及掩耳之势的来了.与3.5相比,sourceinsight4多了代码折叠以及文件标签功能,可谓是让sourceinsight迷兴奋了好几晚上.废话不多说 ...

  4. eclipse自动生成变量名声明(按方法返回值为本地变量赋值)

    eclipse自动生成变量名声明(按方法返回值为本地变量赋值) ctrl+2+L 这个快捷键可自动补全代码,极大提升编码效率! 注:ctrl和2同时按完以后释放,再快速按L.不能同时按! 比如写这句代 ...

  5. CentOS7 虚拟机设置文件共享 VMWareTools安装遇到的坑

    设置文件共享的前提条件是已经安装好VMware Tools. 现在从安装VMware Tools开始讲起: 第一步:安装VMware Tools (如果安装的centos是最小安装,需要提前安装组件g ...

  6. lamp环境搭建之配置apache与fpm方式的php

    配置apache-2.4.9与fpm方式的php-5.4.26 一.apache.MySQL的安装参考<编译安装lamp环境> http://blog.csdn.net/reblue520 ...

  7. C++ code:位操作实例(bit operation example)

    某任务需要在A.B.C.D.E这五个人中物色人员去完成,但派人受限于下列条件: (1)若A去,则B跟去 (2)D,E两人中必有人去 (3)B,C两人中必有人去,但只去一人 (4)C,D两人要么都去,要 ...

  8. samba 设置文件的读写权限

    原文:https://blog.csdn.net/lan120576664/article/details/50396511 打开配置文件 sudo pico /etc/samba/smb.conf ...

  9. php-fpm 配置文件检测

    用过 Nginx 的兄弟都知道,修改 Nginx 配置文件之后,可以使用 nginx -t 来检测配置文件是否有语法错误. 今天配置 opcache 的时候,发现 php-fpm 也可以检测 php- ...

  10. python接口自动化测试十九:函数

    # 函数 a = [1, 3, 6, 4, 85, 32, 46]print(sum(a)) # sum,求和函数 def add(): a = 1, b = 2, return a + bprint ...