[NOI.AC#33]bst 线段树
区间修改,完全二叉树,这引导我们把这棵树看成一棵线段树 。线段树的每一个节点相当于这棵二叉树的节点,
对于区间交换操作,我们对二叉树的每一层从上到下分别考虑,找到L,R在第i层对应的节点修改
这里有个技巧:在第i层,把这棵线段树的第i层当做叶子节点,即值域变为 \(1\dots2^i\)
每个点维护一个标记和一个翻转,标记存被翻转的深度集合,翻转标记记录该点是否被翻转
然后递归时,检查该点是否被翻转,如果被翻转,则进入另外的子树
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
using namespace std;
struct FastIO{
static const int S=1310720;
char buf[S],wbuf[S],*si=buf,*ti=buf,*so=wbuf,*to=wbuf+S;
~FastIO(){fwrite(wbuf,1,so-wbuf,stdout);}
#define gc (si==ti&&(ti=buf+fread(si=buf,1,S,stdin),si==ti)?EOF:*si++)
template<typename T>inline void read(T&w){register char c,p=0;
while(isspace(c=gc));if(c=='-')p=1,c=gc;
for(w=c&15;isdigit(c=gc);w=w*10+(c&15));if(p)w=-w;
}
inline int read(){register int x;return read(x),x;}
#define pc(c) (so==to?fwrite(wbuf,1,S,stdout),so=wbuf,*so++=c:*so++=c)
template<typename T>inline void print(T w,char c='\n'){
static char s[25];int top=0;
if(w<0)pc('-'),w=-w;if(w==0)pc('0');
for(top=0;w;w/=10)s[++top]=w%10;
while(top)pc(s[top--]|'0');pc(c);
}
#undef gc
}io;
#define read io.read
const int N=1<<22;
int n,q;
#define ls o<<1
#define rs o<<1|1
int tag[N];bool rev[N];
inline void change(int o,int d,int v){tag[o]^=v;if(v>>d&1)rev[o]^=1;}
#define pushdown() if(tag[o])change(ls,d+1,tag[o]),change(rs,d+1,tag[o]),tag[o]=0
inline void update(int o,int l,int r,int d,int x,int y,int z){
if(x<=l&&r<=y)return change(o,d,1<<z);
int mid=l+r>>1;pushdown();
if(x<=mid)rev[o]?update(rs,mid+1,r,d+1,x+r-mid,y+r-mid,z):update(ls,l,mid,d+1,x,y,z);
if(y>mid)rev[o]?update(ls,l,mid,d+1,x-r+mid,y-r+mid,z):update(rs,mid+1,r,d+1,x,y,z);
}
inline int ask(int o,int l,int r,int d,int x){
if(l==r)return l;
int mid=l+r>>1;pushdown();
if(rev[o])return x<=mid?ask(rs,mid+1,r,d+1,x+r-mid):ask(ls,l,mid,d+1,x-r+mid);
return x<=mid?ask(ls,l,mid,d+1,x):ask(rs,mid+1,r,d+1,x);
}
int main(){
n=read(),q=read();
while(q--){
int op=read(),x=read(),y;
if(op==1){
y=read();
REP(i,0,n-1){
int l=max(1<<i,x)-(1<<i),r=min((1<<i+1)-1,y)-(1<<i);
if(l<=r)update(1,0,(1<<i)-1,0,l,r,i);
}
}else io.print(ask(1,0,(1<<n)-1,0,x-1)+1);
}
return 0;
}
[NOI.AC#33]bst 线段树的更多相关文章
- 「NOI.AC」Leaves 线段树合并
题目描述 现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有\(n\)个叶子节点,满足这些权值为\(1\dots n\)的一个排列).可以任意交换每个非叶子节点的左右孩子. ...
- 洛谷 P7879 -「SWTR-07」How to AK NOI?(后缀自动机+线段树维护矩乘)
洛谷题面传送门 orz 一发出题人(话说我 AC 这道题的时候,出题人好像就坐在我的右侧呢/cy/cy) 考虑一个很 naive 的 DP,\(dp_i\) 表示 \([l,i]\) 之间的字符串是否 ...
- hdu3973 AC's String 线段树+字符串hash
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3973/ 题意是:给出一个模式串,再给出一些串组成一个集合,操作分为两种,一种是替换模式串中的一个字符,还有一种是 ...
- NOI 2017 整数(线段树)
题意 https://loj.ac/problem/2302 思路 拆分成每个二进制位的加减来考虑,维护那个整数的二进制位.不难发现,进位就是找右边第一个 \(0\) 的位置,并将其赋值为 \(1\) ...
- 背单词(AC自动机+线段树+dp+dfs序)
G. 背单词 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 给定一张包含N个单词的表,每个单词有个价值W.要求从中选出一个子序列使 ...
- HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)
http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...
- HDU 1166 敌兵布阵(线段树/树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU1166-敌兵布阵 (线段树)
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) ...
- Tunnel Warfare(hdu1540 线段树)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
随机推荐
- tt
Oracle报错处理 1.oem启动报错 解决方案:
- ubuntu中开启、关闭防火墙
1.关闭ubuntu的防火墙 ufw disable 开启防火墙 ufw enable 2.卸载了iptables apt-get remove iptables 3.关闭 ...
- 函数指针的转换 & C的注意点
再让我们看看<signal.h>中声明的signal函数void (*signal(int, void(*)(int)))(int)首先,用typedef简化,typedef void ( ...
- SQL Server 2000数据库备份与恢复图解
SQL Server 2000数据库备份与恢复图解 四个步骤:1.安装sql server 2000 2.数据库设置: 3.建立自动备份 4.还原数据库 具体图片见附件 本文出自 "李 ...
- Python(二) 表示‘组’的概念与定义
现实世界中总存在一组一组的事物, 一.列表的定义 type(['hello','world',1,9,True,False]) = <class 'list'> type([[1,2,3, ...
- css3透明度
http://www.haorooms.com/post/css_common //透明度 div{ background: #00c2de; opacity: 0.9; filter: alpha( ...
- Beautiful Number
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2829 Beautiful Number Time Limit: 2 Sec ...
- C2mini 摄像头添加 到 7832N 录像机方法
1.在YS7.com 把2个设备全部添加 (录像机也可以通过手机添加) 2.在录像机里添加摄像头 注: 如出现 “未知错误”可能为录像机版本过低造成.
- vim7.4官方源码在vs2013的编译方法及问题总结
vim7.4发布也有一段时候了,也该是把之前编译的7.3重新编译一下了,于是考虑着到最新的visual studio 2013编译一下,也顺便看看有没有其它问题. 1.安装vs2013,这个应该不用说 ...
- IDEA下——Spring入门程序
创建一个Maven的项目,我的项目结构如下: 在pom文件里写下需要导入的依赖: <?xml version="1.0" encoding="UTF-8" ...