链接

区间修改,完全二叉树,这引导我们把这棵树看成一棵线段树 。线段树的每一个节点相当于这棵二叉树的节点,

对于区间交换操作,我们对二叉树的每一层从上到下分别考虑,找到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 线段树的更多相关文章

  1. 「NOI.AC」Leaves 线段树合并

    题目描述 现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有\(n\)个叶子节点,满足这些权值为\(1\dots n\)的一个排列).可以任意交换每个非叶子节点的左右孩子. ...

  2. 洛谷 P7879 -「SWTR-07」How to AK NOI?(后缀自动机+线段树维护矩乘)

    洛谷题面传送门 orz 一发出题人(话说我 AC 这道题的时候,出题人好像就坐在我的右侧呢/cy/cy) 考虑一个很 naive 的 DP,\(dp_i\) 表示 \([l,i]\) 之间的字符串是否 ...

  3. hdu3973 AC's String 线段树+字符串hash

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3973/ 题意是:给出一个模式串,再给出一些串组成一个集合,操作分为两种,一种是替换模式串中的一个字符,还有一种是 ...

  4. NOI 2017 整数(线段树)

    题意 https://loj.ac/problem/2302 思路 拆分成每个二进制位的加减来考虑,维护那个整数的二进制位.不难发现,进位就是找右边第一个 \(0\) 的位置,并将其赋值为 \(1\) ...

  5. 背单词(AC自动机+线段树+dp+dfs序)

    G. 背单词 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较   题目描述 给定一张包含N个单词的表,每个单词有个价值W.要求从中选出一个子序列使 ...

  6. HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)

    http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...

  7. HDU 1166 敌兵布阵(线段树/树状数组模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  8. HDU1166-敌兵布阵 (线段树)

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)     ...

  9. Tunnel Warfare(hdu1540 线段树)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

随机推荐

  1. Unity 如何将apk放到Android系统的system里

    有时我们需要用unity开发一款Android的系统软件,很坑,步骤如下: 1.用unity打包出来,签名. 2.用解压工具打开签过名的apk. 3.将lib里面的.so文件复制出来. 4.adb r ...

  2. ARM官方《CMSIS-RTOS教程》之线程Threads

    创建线程Creating Threads 一旦RTOS开始运行,就会有很多系统调用来管理和控制活跃的线程.默认情况下,main()函数自动被创建为第一个可运行的线程.在第一个例子里我们使用main() ...

  3. Qt 在圆形中贴图片

    void Widget::paintEvent(QPaintEvent *) { QPainter p(this); QPixmap pix(":/images/a.jpg"); ...

  4. 洛谷—— P2934 [USACO09JAN]安全出行Safe Travel || COGS ——279|| BZOJ——1576

    https://www.luogu.org/problem/show?pid=2934 题目描述 Gremlins have infested the farm. These nasty, ugly ...

  5. Java中发送http的get、post请求

    近期做项目中,须要把消息通过中间件的形式通过http请求的方式推送给第三方,因此用到了http协议,小编花费了一个多小时.对于http协议中的post和get请求,封装了一个工具类.以下与大家分享一下 ...

  6. CSS浏览器兼容问题集(一)

    CSS对浏览器的兼容性有时让人非常头疼,也许当你了解其中的技巧跟原理,就会认为也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理方法并整理了一下.对于web2.0的过度,请尽量用xhtml ...

  7. session和cookie详解

    摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一 技术.本文将详细讨论session的工作机制并且对在Java ...

  8. 字典(dictionary)与映射(map)

    1. 字典:key-value 键值对 反转字典:reverse_dict = dict(zip(D.values(), D.keys())) 前提要保证 D 的 value 不会出现重复,因为字典反 ...

  9. 使用INSERT…SELECT语法插入记录(三十二)

    前面,我们在谈INSERT语句时,使用两种语句:INSERT…SELECT  和  INSERT…VALUES. INSERT…SELECT可以使用子查询.因为在写SELECT时.  ***  =   ...

  10. 洛谷P4093 [HEOI2016/TJOI2016]序列

    题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所有变化的可能性, ...