题目链接

BZOJ5312: 冒险

题解

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

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

否则递归子树

复杂度证明:

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

代码

#include<cstdio>
#include<algorithm>
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9'){if(c == '-')f = -1; c = getchar(); }
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar();
return x *f ;
} const int maxn = 2000007;
int n,a[maxn],m;
int A[maxn << 1],O[maxn << 1],t[maxn << 1],tag[maxn];
#define ls x << 1
#define rs x << 1 | 1
inline void update(int x) {
A[x] = A[ls] & A[rs];
O[x] = O[ls] | O[rs];
t[x] = std::max(t[ls],t[rs]);
}
inline void ps(int x,int k ) { tag[x] += k; A[x] += k; O[x] += k; t[x] += k; }
void pushdown(int x) {
ps(ls,tag[x]);
ps(rs,tag[x]);
tag[x] = 0;
return;
}
void build(int x,int l,int r) {
if(l == r) {
A[x] = O[x] = t[x] = a[l];
return ;
}
int mid = l + r >> 1;
build(x << 1,l,mid); build(x << 1 | 1,mid + 1,r);
update(x);
}
void modify(int x,int l,int r,int L,int R,int k,int type) {
bool t = false;
if(type == 1) {
if((O[x] & k) == O[x]) return;
t = ((A[x] & k) - A[x] == (O[x] & k) - O[x]);
} else {
if((A[x] | k) == A[x]) return;
t = ((A[x] | k) - A[x] == (O[x] | k) - O[x]);
}
if(l >= L && r <= R && t) {
if(type == 1) ps(x,(A[x] & k) - A[x]);
else ps(x, (O[x] | k) - O[x]);
return;
}
if(tag[x]) pushdown(x);
int mid = l + r >> 1;
if(L <= mid) modify(ls,l,mid,L,R,k,type);
if(R > mid) modify(rs,mid + 1,r,L,R,k,type);
update(x);
}
int query(int x,int l,int r,int L ,int R) {
if(l >= L && r <= R) return t[x];
int ret = 0;
if(tag[x]) pushdown(x);
int mid = l + r >> 1;
if(L <= mid) ret = std::max(ret,query(ls,l,mid,L,R));
if(R > mid) ret = std::max(ret,query(rs,mid + 1,r,L,R));
return ret;
}
int main() {
n = read(); m = read();
for(int i = 1;i <= n;++ i) a[i] = read();
build(1,1,n);
for(int i = 1;i <= m;i += 1) {
int type = read(),l = read(),r = read();
if(type == 1) {
int x = read();
modify(1,1,n,l,r,x,type);
} else if(type == 2) {
int x = read();
modify(1,1,n,l,r,x,type);
} else
printf("%d\n",query(1,1,n,l,r));
}
return 0;
}

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. ssh Jetson tk1

    背景: 因为TK1要放到智能车上,不方便打开roscore和各个节点,因此需要PC远程控制. 方法: 在PC端用ssh命令登录: (1)命令sudo ssh tegra-ubuntu.local(te ...

  2. pyppeteer爬虫例子

    如果在centos上使用,需要安装下面的依赖 yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x8 ...

  3. centos6.5环境搭建openvp服务器及windows客户端搭建及配置详解

    1.环境搭建 说明: vpn client 192.168.8.16/24 openvpn server: eth0: 192.168.8.41 eth1: 172.16.1.10 app serve ...

  4. centos6.5下vsftpd服务的安装及配置并通过pam认证实现虚拟用户文件共享

    FTP的全称是File Transfer Protocol(文件传输协议),就是专门用来传输文件的协议.它工作在OSI模型的第七层,即是应用层,使用TCP传输而不是UDP.这样FTP客户端和服务器建立 ...

  5. HTTP SIP 认证

    HTTP请求报头: Authorization HTTP响应报头: WWW-Authenticate   HTTP认证  基于  质询  /回应(  challenge/response)的认证模式. ...

  6. Springboot分模块开发

    这是个spring cloud项目,service-base:基础服务:service-config:配置中心:service-entity:实体类: service-gateway:服务网关:ser ...

  7. [java]用md5来判断两个文件是否完全相同

    1. 前言 由于相比较两张图片是否是相同,如果通过像素点比较感觉速度比较慢,当很多图片进行比较时,效率就低很多了.由于每个文件md5基本上是唯一的,所以用获取文件的md5来判断是否相同文件. 2. 代 ...

  8. typeof引发的思考

    今天在群里看到一位网友提问:var status=1; typeof status 结果输出什么 我会心一笑  ,这尼玛这么简单,一看就是‘number’,结果网友说不是number,而是string ...

  9. OCM_第七天课程:Section3 —》数据库可用性

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  10. impress.js

    介绍一下 impress.js是一个非常炫酷的幻灯片展示框架,依靠CSS3技术. impress.js使用起来非常简单,下面就来简单介绍一下其用法. Start 首先,当然要引入impress.js. ...