[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$ ...
随机推荐
- (转)java使用jsp servlet来防止csrf 攻击的实现方法
背景: 1.csrf知识 CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或 ...
- Linux 解压 压缩 tar
tar 格式:tar [选项] 目录或文件 // 将 test 文件夹打包成 test.tar $ tar cvf test.tar test // 将 home 目录下的 test 文件夹打 ...
- RK3288 添加USB转虚拟串口设备
在系统开启并有日志打印的前提下,插入USB设备,就会打印USB设备和虚拟串口信息. 打印信息如下: 供应商ID(VID):idVendor=1234,产品ID(PID): idProduct=5678 ...
- GPS数据包格式解析
四种定位系统:1.美国的全球定位系统(Global Positioning System,GPS)2.俄罗斯的格罗拉斯(Global Nabigation Satellite System,GLONA ...
- matlab读写图片,读取图像序列,读取AVI视频
介绍使用matlab读写图片,读取图像序列,读取AVI视频的方法: 一.读写图像 使用matlab读一幅图像,并另存 % Filename: ImageReadWrite clc; clear; i ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
- js继承方式及其优缺点?
原型链继承的缺点一是字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数.借用构造函数(类式继承)借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起.所以我们需要 ...
- Android网络技术
WebView使用方法: 1.设置布局,在activity_main.xml中添加<webView> <LinearLayout...... <webView android: ...
- librtmp接收flv流中提取h264码流:根据多个资料汇总
rtmpdump可以下载rtmp流并保存成flv文件.如果要对流中的音频或视频单独处理,需要根据flv协议分别提取.简单修改rtmpdump代码,增加相应功能.1 提取音频:rtmpdump程序在Do ...
- ios真机连接不上记录,再次执行脚本说找不到真机的解决
1.连接其他手机iphone 6 plus 和 iphone x 的时候,连接不上 appium desired capabilities 获取不了元素 提示 An unknown server ...