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: 冒险(势能均摊线段树)的更多相关文章
- BZOJ5312 冒险 势能分析、线段树
传送门 区间位赋值.区间求最大值似乎是不能够像一般的线段树一样直接打标记的,但是直接暴力也太没有面子了. 我们考虑优化一下暴力:如果说线段树的一段区间内在当前修改的所有位置上所有数都是相同的,那么这个 ...
- bzoj5312 冒险(吉司机线段树)题解
题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 按位与\(x\) \(2.\)区间\([L,R]\) 按位或\(x\) \(3.\)区间\([L,R]\) 询问最大值 ...
- 洛谷 P6783 - [Ynoi2008] rrusq(KDT+势能均摊+根号平衡)
洛谷题面传送门 首先显然原问题严格强于区间数颜色,因此考虑将询问离线下来然后用某些根号级别复杂度的数据结构.按照数颜色题目的套路,我们肯定要对于每种颜色维护一个前驱 \(pre\),那么答案可写作 \ ...
- 【LOJ#6029】市场(线段树)
[LOJ#6029]市场(线段树) 题面 LOJ 题解 看着就是一个需要势能分析的线段树. 不难发现就是把第二个整除操作化为减法. 考虑一下什么时候整除操作才能变成减法. 假设两个数为\(a,b\). ...
- 【洛谷3822】[NOI2017] 整数(线段树压位)
题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...
- POJ 3468 A Simple Problem with Integers(线段树区间更新)
题目地址:POJ 3468 打了个篮球回来果然神经有点冲动. . 无脑的狂交了8次WA..竟然是更新的时候把r-l写成了l-r... 这题就是区间更新裸题. 区间更新就是加一个lazy标记,延迟标记, ...
- BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...
- BZOJ5312 冒险(势能线段树)
BZOJ题目传送门 表示蒟蒻并不能一眼看出来这是个势能线段树. 不过仔细想想也并非难以理解,感性理解一下,在一个区间里又与又或,那么本来不相同的位也会渐渐相同,线段树每个叶子节点最多修改\(\log ...
- 【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析
题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之 ...
随机推荐
- Latex 公式颜色
如何给这个公式加上颜色? 解决方法: \usepackage{xcolor} \begin{align} \textcolor{red}{\int_a^b}\textcolor{blue}{f(x ...
- python模块分析之typing(三)
前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种 ...
- UML和模式应用5:细化阶段(2)--细化阶段制品之领域模型
1.前言 领域模型是OO分析中最重要和经典的模型.它阐述了领域中的重要概念: 领域模型作为设计某些软件对象的重要来源,也作为案例研究中探讨的几个制品的输入: 领域模型的范围限定于当前迭代开发的用例场景 ...
- nodejs 文件拷贝
小文件拷贝 我们使用NodeJS内置的fs模块简单实现这个程序如下. var fs = require('fs'); function copy(src, dst) { fs.writeFileSyn ...
- kafka系列四、kafka架构原理、高可靠性存储分析及配置优化
一.概述 Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cl ...
- js 、c# 编码解码
escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@ ...
- Python-HTML CSS题目
一.简答1.手写html模板,并解释模板每个标签的作用 <!doctype html> 文件类型html <html>页面根 <head>后勤内容 <meta ...
- Vue项目之背景图片打包后路径错误
第一种方法: 原因: 首先,出错点在url-loader上面. // url-loader配置 // build/webpck.base.conf.js { test: /\.(png|jpe?g|g ...
- STM32学习及应用笔记二:一次运算符优先级造成的错误
本人在最近一个项目的开发中,出现一个应为疏忽运算符优先级造成的问题,检查了很久才发现问题,所以觉得运算符的优先级问题还是有必要再研究一下.具体的问题是这样的,我采集了传感器的原始数据,然后会对数据进行 ...
- WPS for Linux
https://www.cnblogs.com/gisalameda/p/6839482.html