[BZOJ5312]冒险

维护一个长度为 n 的序列,支持 m 次操作,操作包括区间按位或一个数,区间按位与一个数,以及查询区间最大值。

线段树每个节点上维护区间与、区间或和区间最大值。
如果一次操作对区间与的影响和对区间或的影响相同,那么就说明对这整个区间的影响都是相同的,就是加上或减去同一个值,直接打标记即可,否则递归下去处理。

abcyan1235题解

#include<bits/stdc++.h>using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
const int N=200010;
struct node
{int l,r;ll And,Or;ll v,tag;
}tree[N<<2];
int n,m;
void pushup(int u)
{tree[u].v=max(tree[u<<1].v,tree[u<<1|1].v);tree[u].And=(tree[u<<1].And&tree[u<<1|1].And);tree[u].Or=(tree[u<<1].Or|tree[u<<1|1].Or);
}
void put(int u,int v)
{tree[u].v+=v,tree[u].And+=v,tree[u].Or+=v,tree[u].tag+=v;
}
void pushdown(int u)
{if(!tree[u].tag) return;put(u<<1,tree[u].tag),put(u<<1|1,tree[u].tag);tree[u].tag=0;
}
void build(int u,int l,int r)
{tree[u]={l,r};if(l==r) {tree[u].v=tree[u].And=tree[u].Or=rd();return;}int mid=l+r>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);pushup(u);
}
void modify1(int u,int l,int r,int v)
{if((tree[u].Or&v)==tree[u].Or) return;if(l<=tree[u].l&&tree[u].r<=r&&((tree[u].And&v)-tree[u].And==(tree[u].Or&v)-tree[u].Or)) return put(u,(tree[u].And&v)-tree[u].And),void();pushdown(u);int mid=tree[u].l+tree[u].r>>1;if(l<=mid) modify1(u<<1,l,r,v);if(r>mid) modify1(u<<1|1,l,r,v);pushup(u);
}
void modify2(int u,int l,int r,int v)
{if((tree[u].And|v)==tree[u].And) return;if(l<=tree[u].l&&tree[u].r<=r&&((tree[u].And|v)-tree[u].And==(tree[u].Or|v)-tree[u].Or)) return put(u,(tree[u].And|v)-tree[u].And),void();pushdown(u);int mid=tree[u].l+tree[u].r>>1;if(l<=mid) modify2(u<<1,l,r,v);if(r>mid) modify2(u<<1|1,l,r,v);pushup(u);
}
int query(int u,int l,int r)
{if(l<=tree[u].l&&tree[u].r<=r) return tree[u].v;pushdown(u);int mid=tree[u].l+tree[u].r>>1;int v=0;if(l<=mid) v=max(v,query(u<<1,l,r));if(r>mid) v=max(v,query(u<<1|1,l,r));return v;
}
int main()
{n=rd(),m=rd();build(1,1,n);while(m--){int op=rd(),l=rd(),r=rd(),v;if(op!=3) v=rd();if(op==1) modify1(1,l,r,v);if(op==2) modify2(1,l,r,v);if(op==3) printf("%d\n",query(1,l,r));}return 0;
}

[BZOJ5312]冒险(势能线段树)相关推荐

  1. 势能线段树/吉司机线段树-我没有脑子

    势能线段树/吉司机线段树 BZOJ3211 花神游历各国 BZOJ5312 冒险 BZOJ4355 Play with sequence BZOJ4695 最假女选手 \(A_i = max(A_i, ...

  2. CF765F Souvenirs(势能线段树)

    CF765F Souvenirs problem solution code problem 题目链接 solution 这个势能线段树简直是太巧妙了!!!( ఠൠఠ )ノ 将询问按右端点升序离线下来 ...

  3. 势能线段树(均摊分析)

    势能线段树 线段树能够通过打懒标记实现区间修改的条件有两个: 能够快速处理懒标记对区间询问结果的影响 能够快速实现懒标记的合并 但有的区间修改不满足上面两个条件(如区间整除/开方/取模等). 但某些修 ...

  4. 势能线段树(吉司机线段树)专题

    势能线段树(吉司机线段树)专题 势能线段树在近期训练时遇到了好几次,但是由于本人太懒一直没补完,结果ICPC网络赛还真就出了一道势能线段树Orz--结果当然是没做出来--痛定思痛,这回把之前欠的一块儿 ...

  5. 【题型总结】势能线段树

    吉老师势能线段树论文 ABC256Ex - I like Query Problem 题目链接 1 L R x:对 i = L , L + 1 , ⋯ , R i=L,L+1,\cdots,R i=L ...

  6. 2021CCPC东北四省赛 D. Lowbit 势能线段树

    传送门 分析 分析一下x+lowbit(x)x + lowbit(x)x+lowbit(x)这个操作 如果多次操作之后,那么xxx中只会有最高位存在一,这个时候再执行一次操作就会使整个数字乘二 所以, ...

  7. 「雅礼集训」市场--势能线段树

    题目链接: https://loj.ac/p/6029 题意: 思路: 势能时间分析: 每次除数至少为2,所以一个数最多除log次,log次操作后一个区间就会相等,加法又需要log次使区间相等,所以使 ...

  8. 数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

    值域线段树+势能线段树+扫描线 KiKi's K-Number ball The Child and Sequence 「雅礼集训 2017 Day1」市场 Atlantis KiKi's K-Num ...

  9. CF 1642 E. Anonymity Is Important 线段树 + 离线

    文章目录 题意 思路 传送门 题意 有nnn个人,给你qqq个请求,分以下三种: [l,r,x][l,r,x][l,r,x] 如果x=0x=0x=0,代表[l,r][l,r][l,r]这个区间内的人都 ...

最新文章

  1. python sqlalchemy中文手册-基于Python的SQLAlchemy的操作
  2. 线程: ReentrantLock类
  3. Node.js环境搭建npm安装
  4. ITK:为每个像素添加常量
  5. 最小错误率贝叶斯决策
  6. 一个DDOS病毒的分析(二)
  7. JavaScript定义类的几种方式
  8. 浅谈,JavaScript 运行机制和Event Loop
  9. php数据库--mysql优化
  10. Keil(MDK-ARM-STM32)系列教程(八)在线调试(Ⅰ)
  11. 笔记.NET基础知识05
  12. asp.net中使用下拉菜单的级联问题
  13. ISL22346WFRT20Z-TK 数字电位器 4路 I²C
  14. Java截图转文字程序
  15. 教学:四步利用PHP study小皮面板在vscode上编辑php并运行
  16. C语言struct 函数,C语言结构体史上最详细的讲解
  17. kubernetes 非安全部署
  18. 如何在微信环境中点击链接关注微信公众号
  19. KMD驱动教程续-11
  20. 自动控制原理(根轨迹)

热门文章

  1. php 命名空间(,PHP命名空间(Namespace)简明教程
  2. 行者运行脚本命令_行者脚本指令说明
  3. linux脚本启三个tomcat,linux 重写Tomcat启停脚本
  4. c语言next的用法,C语言strchr使用之Next查找和截断想要的字符串
  5. 后端学习 - MyBatis
  6. leetcote34. 在排序数组中查找元素的第一个和最后一个位置
  7. 7-21 求前缀表达式的值 (25 分)(思路详解)
  8. 什么事计算机事实性知识,《人工智能》复习要点
  9. [计组]寄存器的基本含义
  10. java循环语句_java中循环语句