题目大意

您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 。


题解

splay裸题,维护子树翻转信息即可。


代码:

#include <cstdio>
#include <iostream>
using namespace std;struct Node {int key,siz;bool flip;Node *ch[2],*fa;Node();Node(int);void pushdown();void maintain();int dir(int val) {if(val==ch[0]->siz+1) return -1;return val>ch[0]->siz+1;}int son() {if(fa->ch[1]==this) return 1;if(fa->ch[0]==this) return 0;return -1;}
}*null,*root;
Node:: Node():key(-1) {siz=null?1:0;flip=false;ch[0]=ch[1]=fa=null;
}
Node:: Node(int _):key(_) {siz=null?1:0;flip=false;ch[0]=ch[1]=fa=null;
}
void Node:: maintain() {siz=ch[0]->siz+1+ch[1]->siz;return;
}
void Node:: pushdown() {if(flip) {swap(ch[0],ch[1]);ch[0]->flip^=1, ch[1]->flip^=1;flip=false;}return;
}void print(Node* cur) {if(cur==null) return;cur->pushdown();print(cur->ch[0]);cout<<cur->key<<" ";print(cur->ch[1]);
}#define mid ((l+r)>>1)
void build(Node* &cur,int l,int r) {if(l>r) {cur=null; return;}cur=new Node(mid);build(cur->ch[0],l,mid-1); cur->ch[0]->fa=cur;build(cur->ch[1],mid+1,r); cur->ch[1]->fa=cur;cur->maintain();
}
#undef midvoid Rotate(Node* cur,int dir) {Node* tmp=cur->ch[dir^1];cur->ch[dir^1]=tmp->ch[dir], tmp->ch[dir]->fa=cur;tmp->ch[dir]=cur;cur->maintain(), tmp->maintain();if(~cur->son()) cur->fa->ch[cur->son()]=tmp;tmp->fa=cur->fa, cur->fa=tmp;
}void Pushdown(Node* cur) {if(cur->fa!=null) Pushdown(cur->fa);cur->pushdown();
}void Splay(Node* cur) {while(~cur->son()) {int dir=cur->son();if(dir==cur->fa->son()) Rotate(cur->fa->fa,dir^1);Rotate(cur->fa,dir^1);}
}
Node* _find(Node *cur,int k) {cur->pushdown();int dir=cur->dir(k);if(dir==1) k-=cur->ch[0]->siz+1;if(dir==-1) return cur;else return _find(cur->ch[dir],k);
}Node* Merge(Node *lhs,Node* rhs) {if(lhs==null) return rhs;if(rhs==null) return lhs;Node* tmp=_find(lhs,lhs->siz);Splay(tmp);tmp->ch[1]=rhs, rhs->fa=tmp, tmp->maintain();return tmp;
}void Split(Node* org,int k,Node* &lhs,Node* &rhs) {if(k==0) {lhs=null, rhs=org;return;} else if(k==org->siz) {lhs=org, rhs=null;return;}Node* tmp=_find(org,k);Splay(tmp);lhs=tmp, rhs=tmp->ch[1];rhs->fa=null, lhs->ch[1]=null, lhs->maintain();return;
}void Reverse(int l,int r) {Node *lhs,*tmp,*mid,*rhs;Split(root,l-1,lhs,mid);Split(mid,r-l+1,mid,rhs);mid->flip^=1;root=Merge(Merge(lhs,mid),rhs);return;
}int main() {
#ifndef ONLINE_JUDGEfreopen("input.txt","r",stdin);freopen("output.txt","w",stdout);
#endif // ONLINE_JUDGEnull=new Node();null->ch[0]=null->ch[1]=null->fa=null;root=null;int n,m;scanf("%d%d",&n,&m);build(root,1,n);for(int i=1;i<=m;i++) {int l,r;scanf("%d%d",&l,&r);Reverse(l,r);}print(root);return 0;
}

BZOJ3323 文艺平衡树 (splay 绿色无毒模板)相关推荐

  1. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)...

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostr ...

  2. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 6881  Solved: 4213 [Submit][S ...

  3. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

  4. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

  5. 文艺平衡树 Splay 学习笔记(1)

    (这里是Splay基础操作,reserve什么的会在下一篇里面讲) 好久之前就说要学Splay了,结果苟到现在才学习. 可能是最近良心发现自己实在太弱了,听数学又听不懂只好多学点不要脑子的数据结构. ...

  6. 史上最详尽的平衡树(splay)讲解与模板

    首先声明:万分感谢gty大哥的帮助!这年头能找到简单易懂的数组版平衡树模板只能靠学长了! 变量声明:f[i]表示i的父结点,ch[i][0]表示i的左儿子,ch[i][1]表示i的右儿子,key[i] ...

  7. 洛谷 P3391 【模板】文艺平衡树

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4 ...

  8. 【luogu P5055】【模板】可持久化文艺平衡树

    [模板]可持久化文艺平衡树 题目链接:luogu P5055 题目大意 要你维护插入,删除,区间翻转,区间求和. 但要求可持续化,即每次操作在一个历史版本上进行,且会产生一个新的历史版本 思路 看到题 ...

  9. 文艺平衡树(Splay)

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

最新文章

  1. linux命令使用全集
  2. [js] script所在的位置会影响首屏显示时间吗
  3. mysql 字符转数值_深入MYSQL字符数字转换的详解
  4. java set泛型_Java 集合二 泛型、Set相关
  5. 小甲鱼python课后题简书_【Python爬虫】-笨办法学 Python 习题01-10
  6. matlab2c使用c++实现matlab函数系列教程-sum函数
  7. Spring Boot 打包成的可执行 jar ,为什么不能被其他项目依赖?
  8. 世界杯:为什么进攻大多沿着边路前进?
  9. ue4 怎么传递变量到另一个蓝图_UE4中用Niagara实现procedural浪花
  10. 规范使用地图,从规范制图开始
  11. 【论文推荐】了解《目标跟踪》必看的6篇论文(附打包下载地址)
  12. 项目管理工具 | 软件开发项目管理软件
  13. 关于165的(ORCAP-1192)
  14. 委外采购订单 Subcontract PO
  15. Unity-黑暗之魂复刻-跳跃功能
  16. Anaconda 使用 set CONDA_FORCE_32BIT=1 切换32位环境失败的解决方法
  17. 微信公众号开发(一)服务器及接口的配置
  18. 我的名字居然是我爸爸用代码算出来的?
  19. kubernetes 安装 Dashboard
  20. 生命不息,折腾不止~Vim编辑器,插件,编译,补全配置(2018)

热门文章

  1. 上市企业创新专题二:研发投入、专利申请和专利授权情况
  2. 主动变被动9个例句_高中英语 :主动表被动的适用范围
  3. codeforces732a
  4. 菜鸟进阶高手, 推荐 7 个 Python 上手实战项目
  5. 源代码品牌升级为源码时代
  6. 网页分享到微信常见问题
  7. 苹果x面容id不可用是什么原因_iPhone X使用体验!苹果手机那么保值是有原因的...
  8. PDF转PPT?只需这两种方法,轻松完成转换
  9. MathType7永久激活码以及MathType如何嵌入到Word中
  10. 你是不是曾经也觉得,上大学最令人兴奋的就是自由了(二)