题目大意:给定一个数列a,你需要支持的操作:区间and,区间or,询问区间最大值

解题关键:

1、双标记线段树,注意优先级(超时)

当涉及多重标记时,定义出标记的优先级,修改操作时用优先级高(先下放)的修正优先级低(后下放)的来保证标记的正确性。

同时维护了区间and,区间or

https://blog.csdn.net/PhantomAgony/article/details/78810369

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#define MAXN 100010
#define INF 0x7fffffff
#define lc rt<<1
#define rc rt<<1|1
namespace IO{
char buf[<<],*fs,*ft;
inline char gc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;}
inline int qr(){
int x=,rev=,ch=gc();
while(ch<''||ch>''){if(ch=='-')rev=;ch=gc();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=gc();}
return rev?-x:x;}
}using namespace IO;
using namespace std;
int N,Q,tago[MAXN<<],taga[MAXN<<],vo[MAXN<<],va[MAXN<<],ma[MAXN<<],a[MAXN];
inline void Up(int rt){
vo[rt]=vo[lc]|vo[rc];va[rt]=va[lc]&va[rc];
ma[rt]=max(ma[lc],ma[rc]);
} inline void PutAnd(int rt,int x){//双标记模板题
taga[rt]&=x;tago[rt]&=x;
ma[rt]&=x;vo[rt]&=x;va[rt]&=x;
}
inline void PutOr(int rt,int x){
tago[rt]|=x;
ma[rt]|=x;vo[rt]|=x;va[rt]|=x;
}
inline void Down(int rt){
if(taga[rt]^INF){
PutAnd(lc,taga[rt]);
PutAnd(rc,taga[rt]);
taga[rt]=INF;
}
if(tago[rt]){
PutOr(lc,tago[rt]);
PutOr(rc,tago[rt]);
tago[rt]=;
}
} void Build(int l,int r,int rt){
taga[rt]=INF;
if(l==r){va[rt]=vo[rt]=ma[rt]=a[l];return;}
int mid=(l+r)>>;
Build(l,mid,lc);
Build(mid+,r,rc);
Up(rt);
}
void Modify(int L,int R,int l,int r,int rt,int x,bool flag){
if(L<=l&&R>=r){
if(flag){//区间&
if(((x^INF)&(va[rt]|(vo[rt]^INF)))==(x^INF)){//都为1或都为0
PutAnd(rt,x);
return;
}
}
else{//区间|
if((x&(va[rt]|(vo[rt]^INF)))==x){
PutOr(rt,x);
return;
}
}
}
Down(rt);
int mid=l+r>>;
if(L<=mid)Modify(L,R,l,mid,lc,x,flag);
if(R>mid)Modify(L,R,mid+,r,rc,x,flag);
Up(rt);
}
int Query(int L,int R,int l,int r,int rt){
if(L<=l&&R>=r)return ma[rt];
int mid=(l+r)>>,ret=;
Down(rt);
if(L<=mid)ret=Query(L,R,l,mid,lc);
if(R>mid)ret=max(ret,Query(L,R,mid+,r,rc));
return ret;
}
int op,x,y,z;
int main(){
freopen("series_wei.in","r",stdin);
freopen("series_wei.out","w",stdout);
N=qr();Q=qr();
for(int i=;i<=N;i++)a[i]=qr();
Build(,N,);
while(Q--){
op=qr();x=qr();y=qr();
if(op==)z=qr(),Modify(x,y,,N,,z,);
else if(op==)z=qr(),Modify(x,y,,N,,z,);
else printf("%d\n",Query(x,y,,N,));
}
return ;
}

2、一个same维护区间内相同的位

#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = ;
const int bas = 0x7fffffff;
int T[maxn<<],lazy[maxn<<],sam[maxn<<];
int a[maxn];
inline void update(int rt){
T[rt]=max(T[rt<<],T[rt<<|]);
sam[rt]=(sam[rt<<]&sam[rt<<|])&(~(T[rt<<]^T[rt<<|]));
} inline void pushdown(int rt){
if(!lazy[rt]) return ;
T[rt<<]+=lazy[rt];lazy[rt<<]+=lazy[rt];
T[rt<<|]+=lazy[rt];lazy[rt<<|]+=lazy[rt];
lazy[rt]=;
} void build(int rt,int l,int r){
if(l==r){
T[rt]=a[l];
sam[rt]=bas;//全1
return;
}
int mid=l+r>>;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
update(rt);
}
int L,R,val,tmp; inline bool check_a(int rt){
tmp=(val^bas);
return (tmp&sam[rt])==tmp;
} void modify_a(int rt,int l,int r){
if(L<=l&&r<=R&&check_a(rt)){
tmp=(T[rt]&val)-T[rt];
lazy[rt]+=tmp;
T[rt]+=tmp;
return;
}
pushdown(rt);
int mid=l+r>>;
if(L<=mid) modify_a(rt<<,l,mid);
if(R>mid) modify_a(rt<<|,mid+,r);
update(rt);
}
void modify_o(int rt,int l,int r){
if(L<=l&&r<=R&&(sam[rt]&val)==val){
tmp=(T[rt]|val)-T[rt];
lazy[rt]+=tmp;
T[rt]+=tmp;
return;
}
int mid=l+r>>;
pushdown(rt);
if(L<=mid) modify_o(rt<<,l,mid);
if(R>mid) modify_o(rt<<|,mid+,r);
update(rt);
} int query(int rt,int l,int r){
if(L<=l&&r<=R) return T[rt];
pushdown(rt);
int mid=l+r>>,res=;
if(L<=mid) res=max(res,query(rt<<,l,mid));
if(R>mid) res=max(res,query(rt<<|,mid+,r));
return res;
}
int main(){
freopen("series_wei.in","r",stdin);
freopen("series_wei.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",a+i);
build(,,n);
int opt;
while(m--){
scanf("%d%d%d",&opt,&L,&R);
if(opt == ) scanf("%d",&val),modify_a(,,n);
else if(opt == ) scanf("%d",&val),modify_o(,,n);
else printf("%d\n",query(,,n));
}
return ;
}

[cogs2638]数列操作ψ(双标记线段树)的更多相关文章

  1. 2018.07.31cogs2964. 数列操作η(线段树)

    传送门 线段树基本操作. 给出一个排列b,有一个初始值都为0的数组a,维护区间加1,区间统计区间∑(ai/bi)" role="presentation" style=& ...

  2. 值得一做》关于双标记线段树两三事BZOJ 1798 (NORMAL-)

    这是一道双标记线段树的题,很让人很好的预习/学习/复习线段树,我不知道它能让别人学习什么,反正让我对线段树的了解更加深刻. 题目没什么好讲的,程序也没什么好讲的,所以也没有什么题解,但是值得一做 给出 ...

  3. BZOJ_1858_[Scoi2010]序列操作_线段树

    BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询 ...

  4. 【BZOJ1858】序列操作(线段树)

    [BZOJ1858]序列操作(线段树) 题面 BZOJ 题解 这题思路很简单,细节很烦,很码 维护区间翻转和区间赋值标记 当打到区间赋值标记时直接覆盖掉翻转标记 下放标记的时候先放赋值标记再放翻转标记 ...

  5. 【BZOJ2962】序列操作(线段树)

    [BZOJ2962]序列操作(线段树) 题面 BZOJ 题解 设\(s[i]\)表示区间内选择\(i\)个数的乘积的和 考虑如何向上合并? \(s[k]=\sum_{i=0}^klson.s[i]*r ...

  6. 【双标记线段树】bzoj1798维护序列seq

    一.题目 描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列 ...

  7. CDOJ 1157 数列(seq) 分块+线段树

    数列(seq) Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1157 Desc ...

  8. [LuoguP1438]无聊的数列(差分+线段树/树状数组)

    \(Link\) \(\color{red}{\mathcal{Description}}\) 给你一个数列,要求支持单点查询\(and\)区间加等差数列. \(\color{red}{\mathca ...

  9. [bzoj2962]序列操作_线段树_区间卷积

    序列操作 bzoj-2962 题目大意:给定一个n个数的正整数序列,m次操作.支持:1.区间加:2.区间取相反数:3.区间求选c个数的乘积和. 注释:$1\le n,m\le 5\cdot 10^4$ ...

随机推荐

  1. python模块--os模块的用法

    os.getcwd() 获取当前工作的目录,即当前python脚本工作的目录路径 os.phdir("dirname") 改变当前脚本的工作目录:相当于shell下cd os.cu ...

  2. ballerina 学习三 根据swagger 以及protobuf 生成code

    备注: 基本环境安装就不用介绍了,swagger 以及grpc 同时也不用介绍了,都是比较简单的代码,就是一个简单的测试 1.   初始化项目 ballerina init 项目结构如下: ├── R ...

  3. parcel vue 简单使用

    1.安装依赖 yarn global add parcel-bundler yarn add babel-preset-env --dev yarn add parcel-plugin-vue --d ...

  4. Linux VPS上DenyHosts阻止SSH暴力攻击

    2009年07月23日 下午 | 作者:VPS侦探 现在的互联网非常不安全,很多人没事就拿一些扫描机扫描ssh端口,然后试图连接ssh端口进行暴力破解(穷举扫描),所以建议vps主机的空间,尽量设置复 ...

  5. PostgreSQL编译安装

    PostgreSQL编译安装 安装语言包 ### PostgreSQL 初始化过程中,会读取操作系统字符编码, ### 若程序需要使用zh_CN.utf-8字符编码,需要在PostgreSQL 初始化 ...

  6. 常见企业IT支撑【2、samba共享文件夹】

    samba共享文件夹,较Window自带的比较:开源,安全 建议安装samba4,兼容性好 1.安装samba #yum -y install samba4 samba4-client 2.备份sam ...

  7. SAE部署Django1.6+MySQL

    [解决]SAE部署Django1.6+MySQL 终于可以舒口气了,今天大部分时间都在搞这个,很是蛋疼,网上资料良莠不齐,我不信这个之前没人做过,但是他们确实分享的不够好. 废话不多说,还是记录一下今 ...

  8. python list 列表

    1. 什么是列表 列表是一个可变的数据类型 列表由[]来表示, 每一项元素使用逗号隔开. 列表什么都能装. 能装对象的对象. 列表可以装大量的数据 2. 列表的索引和切片 列表和字符串一样. 也有索引 ...

  9. STL算法与树结构模板

    STL算法 STL 算法是一些模板函数,提供了相当多的有用算法和操作,从简单如for_each(遍历)到复杂如stable_sort(稳定排序),头文件是:#include <algorithm ...

  10. Java-Runoob-高级教程:Java 文档注释

    ylbtech-Java-Runoob-高级教程:Java 文档注释 1.返回顶部 1. Java 文档注释 Java 支持三种注释方式.前两种分别是 // 和 /* */,第三种被称作说明注释,它以 ...