题目链接

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. K中心点算法之PAM

    一.PAM聚类算法:         选用簇中位置最中心的对象,试图对n个对象给出k个划分:代表对象也被称为是中心点,其他对象则被称为非代表对象:最初随机选择k个对象作为中心点,该算法反复地用非代表对 ...

  2. 董事局主席董事长总裁首席执行官CEO总裁董事监事区别

    董事长是公司的最大股东:董事长是董事会的主席,一般是企业的所有者,掌握企业的股权并且决定企业的发展策略. 董事局主席通常是在大财团中才会出现,董事局主席管数个董事长,一个大财团涉及很多方面的业务,因此 ...

  3. C:详解C中volatile关键字

    原文地址:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html volatile提醒编译器它后面所定义的变量随时都有可 ...

  4. mybatis主键自增长

    在数据库中建序列:SEQ_T_RESOURCE 第一种:会在传入该方法的的参数集合中添加主键元素,相当于:map.put("RES_ID",xxx); <insert id= ...

  5. spring事物的传播行为及隔离

    关于@Transactional注解: 添加事务注解1.使用 propagation 指定事务的传播行为, 即当前的事务方法被另外一个事务方法调用时如何使用事务, 默认取值为 REQUIRED, 即使 ...

  6. js之观察者模式

    观察者模式: 大体上是, 1.松耦合的代码: 2.一对多的关系: 3.主体状态变化时,所有依赖被通知: 4.主体和观察者互不知晓. 基本上,满足上面四点的,就可以算是观察者模式了.来看一个demo, ...

  7. InterruptedException 异常

    当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛InterruptedException的代表方法有: 1. jav ...

  8. eclipse安装properties插件

    点击“Help”--> Install New Software Name:propertiesLocation:http://propedit.sourceforge.jp/eclipse/u ...

  9. php数据类型之自动转换和强制转换

    PHP在PHP 5.x阶段都是完全的弱类型的编程语言.所谓弱类型,就是在声明变量的时候,不需要指定变量的类型.我要声明一个整型的变量,我不用在前面非得写上类型,再写变量.而PHP 7 的性能有很大的提 ...

  10. django----文件配置

    静态路径配置 STATIC_URL = '/static/' #这个配置就相当于下面配置的别名,如果这里的名字修改了就按照这里的名字去导入 STATICFILES_DIRS = [ os.path.j ...