bzoj

CSAcademy

description

一个序列\(a_i\),支持区间与一个数,区间或一个数,求区间最大值。

\(n,m\le2\times10^5\)

sol

线段树每个节点上维护区间与、区间或和区间最大值。

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

复杂度是\(O(nK\log n)\)的,\(K\)是二进制位数。

如果对复杂度证明感兴趣的话可以去这里

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 2e5+5;
int n,m,And[N<<2],Or[N<<2],Tag[N<<2],Max[N<<2];
void pushup(int x){
And[x]=And[x<<1]&And[x<<1|1];Or[x]=Or[x<<1]|Or[x<<1|1];
Max[x]=max(Max[x<<1],Max[x<<1|1]);
}
void build(int x,int l,int r){
if (l==r) {And[x]=Or[x]=Max[x]=gi();return;}
int mid=l+r>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);
pushup(x);
}
void cover(int x,int v){
Tag[x]+=v;And[x]+=v;Or[x]+=v;Max[x]+=v;
}
void pushdown(int x){
cover(x<<1,Tag[x]);cover(x<<1|1,Tag[x]);Tag[x]=0;
}
void mdf_and(int x,int l,int r,int ql,int qr,int v){
if (l<r) pushdown(x);
if ((Or[x]&v)==Or[x]) return;
if (l>=ql&&r<=qr&&(And[x]&v)-And[x]==(Or[x]&v)-Or[x]){
cover(x,(And[x]&v)-And[x]);return;
}int mid=l+r>>1;
if (ql<=mid) mdf_and(x<<1,l,mid,ql,qr,v);
if (qr>mid) mdf_and(x<<1|1,mid+1,r,ql,qr,v);
pushup(x);
}
void mdf_or(int x,int l,int r,int ql,int qr,int v){
if (l<r) pushdown(x);
if ((And[x]|v)==And[x]) return;
if (l>=ql&&r<=qr&&(And[x]|v)-And[x]==(Or[x]|v)-Or[x]){
cover(x,(And[x]|v)-And[x]);return;
}int mid=l+r>>1;
if (ql<=mid) mdf_or(x<<1,l,mid,ql,qr,v);
if (qr>mid) mdf_or(x<<1|1,mid+1,r,ql,qr,v);
pushup(x);
}
int query(int x,int l,int r,int ql,int qr){
if (l<r) pushdown(x);
if (l>=ql&&r<=qr) return Max[x];
int mid=l+r>>1,res=0;
if (ql<=mid) res=max(res,query(x<<1,l,mid,ql,qr));
if (qr>mid) res=max(res,query(x<<1|1,mid+1,r,ql,qr));
return res;
}
int main(){
n=gi();m=gi();build(1,1,n);
while (m--){
int op=gi(),l=gi(),r=gi(),x;if (op!=3) x=gi();
if (op==1) mdf_and(1,1,n,l,r,x);
if (op==2) mdf_or(1,1,n,l,r,x);
if (op==3) printf("%d\n",query(1,1,n,l,r));
}
return 0;
}

[BZOJ5312]冒险的更多相关文章

  1. bzoj5312: 冒险(势能均摊线段树)

    题目链接 BZOJ5312: 冒险 题解 如果一次操作对区间& 和 区间| 产生的影响是相同的,那么该操作对整个区间的影响都是相同的 对于每次操作,在某些位上的值,对于整个区间影响是相同的,对 ...

  2. BZOJ5312 冒险(线段树)

    记录区间and/or,修改时如果对整个区间影响都相同就打标记,否则递归.复杂度不太会证. #include<iostream> #include<cstdio> #includ ...

  3. BZOJ5312: 冒险【线段树】【位运算】

    Description Kaiser终于成为冒险协会的一员,这次冒险协会派他去冒险,他来到一处古墓,却被大门上的守护神挡住了去路,守护神给出了一个问题, 只有答对了问题才能进入,守护神给出了一个自然数 ...

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

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

  5. bzoj 4695: 最假女选手 && Gorgeous Sequence HDU - 5306 && (bzoj5312 冒险 || 小B的序列) && bzoj4355: Play with sequence

    算导: 核算法 给每种操作一个摊还代价(是手工定义的),给数据结构中某些东西一个“信用”值(不是手动定义的,是被动产生的),摊还代价等于实际代价+信用变化量. 当实际代价小于摊还代价时,增加等于差额的 ...

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

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

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

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

  8. 有趣的线段树模板合集(线段树,最短/长路,单调栈,线段树合并,线段树分裂,树上差分,Tarjan-LCA,势能线段树,李超线段树)

    线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来, ...

  9. BZOJ5312:冒险——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5312 Kaiser终于成为冒险协会的一员,这次冒险协会派他去冒险,他来到一处古墓,却被大门上的守护 ...

随机推荐

  1. Yahoo Programming Contest 2019

    A - Anti-Adjacency 签. #include <bits/stdc++.h> using namespace std; int main() { int n, k; whi ...

  2. CentOS7搭建Gitlab详细过程

    1.参见Gitlab官网说明 原文地址:https://about.gitlab.com/install/#centos-7   1.安装并配置必要的依赖项 在CentOS 7(和RedHat / O ...

  3. 一个PE文件的逆向分析

    一个PE文件的逆向分析 idf-ctf上有个题,是PE文件的逆向,反正对我来说做出来就是有意思的题,做不出来就没劲.言归正传,下面看一下吧 大家想玩可以去这个地方去拿题http://pan.baidu ...

  4. 初识PHP(一)基础语法

    一直准备学习PHP,结果前一段时间总是有事情,耽误了一阵子.现在赶快迎头赶上! 这个系列只是谈谈我对于PHP的一些看法,不是教程性质的.另外我是小白,只是写写随笔,大神求轻拍.本人学习过c .java ...

  5. HDU 6354 Everything Has Changed(余弦定理)多校题解

    题意:源点处有个圆,然后给你m个圆(保证互不相交.内含),如果源点圆和这些原相交了,就剪掉相交的部分,问你最后周长(最外面那部分的长度). 思路:分类讨论,只有内切和相交会变化周长,然后乱搞就行了.题 ...

  6. 解决 Faster R-CNN 图片中框不在一张图片上显示的问题

    目录 解决 Faster R-CNN 图片中框不在一张图片上显示的问题 发现问题 如何解决这个问题? 参考issues 解决 Faster R-CNN 图片中框不在一张图片上显示的问题 发现问题 在使 ...

  7. 使用 reshape2 重塑数据框

    我们已经学习了如何筛选.排序.合并和汇总数据框.这些操作只适用于行和列,然而有时候我们需要做一些更复杂的事情.例如,下面这段代码读取了一个数据集,包含了两种产品不同日期的质量和耐久性的测试结果:toy ...

  8. 在线教育工具—白板系统的迭代1——bug监控排查

    近一年都在做一款在线教育工具(以下统称为“白板”)的开发工作,期间遇到N多的问题与坑,遂在此记录,并及时更新. 第一篇:关于资源访问填坑 因为是在线授课,所以使用我们白板的人员地域范围较广,基本上西到 ...

  9. 【Android】冷门常用 ADB

    清除应用缓存adb shell pm clear 包名 获取手机中安装的包名,加上部分包名可以做筛选 adb shell pm list package adb shell pm list packa ...

  10. 2018-2019-2 网络对抗技术 20165332 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165332 Exp3 免杀原理与实践 实验内容 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用 ...