[cogs2638]数列操作ψ(双标记线段树)
题目大意:给定一个数列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]数列操作ψ(双标记线段树)的更多相关文章
- 2018.07.31cogs2964. 数列操作η(线段树)
传送门 线段树基本操作. 给出一个排列b,有一个初始值都为0的数组a,维护区间加1,区间统计区间∑(ai/bi)" role="presentation" style=& ...
- 值得一做》关于双标记线段树两三事BZOJ 1798 (NORMAL-)
这是一道双标记线段树的题,很让人很好的预习/学习/复习线段树,我不知道它能让别人学习什么,反正让我对线段树的了解更加深刻. 题目没什么好讲的,程序也没什么好讲的,所以也没有什么题解,但是值得一做 给出 ...
- BZOJ_1858_[Scoi2010]序列操作_线段树
BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询 ...
- 【BZOJ1858】序列操作(线段树)
[BZOJ1858]序列操作(线段树) 题面 BZOJ 题解 这题思路很简单,细节很烦,很码 维护区间翻转和区间赋值标记 当打到区间赋值标记时直接覆盖掉翻转标记 下放标记的时候先放赋值标记再放翻转标记 ...
- 【BZOJ2962】序列操作(线段树)
[BZOJ2962]序列操作(线段树) 题面 BZOJ 题解 设\(s[i]\)表示区间内选择\(i\)个数的乘积的和 考虑如何向上合并? \(s[k]=\sum_{i=0}^klson.s[i]*r ...
- 【双标记线段树】bzoj1798维护序列seq
一.题目 描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列 ...
- CDOJ 1157 数列(seq) 分块+线段树
数列(seq) Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1157 Desc ...
- [LuoguP1438]无聊的数列(差分+线段树/树状数组)
\(Link\) \(\color{red}{\mathcal{Description}}\) 给你一个数列,要求支持单点查询\(and\)区间加等差数列. \(\color{red}{\mathca ...
- [bzoj2962]序列操作_线段树_区间卷积
序列操作 bzoj-2962 题目大意:给定一个n个数的正整数序列,m次操作.支持:1.区间加:2.区间取相反数:3.区间求选c个数的乘积和. 注释:$1\le n,m\le 5\cdot 10^4$ ...
随机推荐
- (一)Fiddler的介绍和安装
一.Fiddler的介绍和安装 Fildder是一款免费的web调试代理工具,支持任何浏览器.系统或平台. 官网地址:https://www.telerik.com/fiddler Fiddler原理 ...
- Mac环境下PHPstorm配置xdebug开发调试web程序
一.安装PHP的xdebug扩展 安装xdebug(技巧,为了找到适配的版本,让xdebug网站根据phpinfo()函数输出分析找到对应的方法及安装步骤:如果安装了多个PHP版本的话,尽量用phpi ...
- WebApi和Andriod对接访问模式问题
最近在做WebApi和Andriod接口的对接,中途出现一个问题就是返回格式的问题.由于之前使用WebService的时候使用的一直都是json的序列化和反序列话格式,所以一开始在webapi中通样使 ...
- 微软Azure平台 cloud service动态申请证书并绑定证书碰到的坑
我们有一个saas平台 部分在azure的cloud service 使用lets encrypt来申请证书.每一个商家申请域名之后就需要通过Lets encrypt来得到证书并绑定证书. 主要碰到的 ...
- crontab 定时任务设置
CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使用它在 ...
- HTML4 And HTML5 标签整理
一.文字备忘之标签 HTML5中新增的标签<article> 定义文章 <aside> 定义页面内容旁边的内容 <audio> ...
- DBA_2PC_PENDING (转)
DBA_2PC_PENDINGOracle会自动处理分布事务,保证分布事务的一致性,所有站点全部提交或全部回滚.一般情况下,处理过程在很短的时间内完成,根本无法察觉到.但是,如果在commit或rol ...
- 一步步实现 Redis 搜索引擎
来源:jasonGeng88 github.com/jasonGeng88/blog/blob/master/201706/redis-search.md 如有好文章投稿,请点击 → 这里了解详情 场 ...
- RefWorks
RefWorks公司简介/RefWorks 编辑 RefWorks是美国剑桥信息集团的子公司,是ProQuest 的姊妹公司.该公司于2001年由参考文献管理领域的一些专家组建而成,并致力于为学术机构 ...
- OD 实验(四) - 去除 NAG 窗口的几种方法
程序: 运行 弹出一个窗口,说要注册 点击确定,到主窗口 关闭主窗口 然后弹出提醒注册的对话框 逆向程序 用 OD 打开程序 GetModuleHandleA 获取程序模块的句柄,程序在内存中的基址 ...