3223: Tyvj 1729 文艺平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 3313  Solved: 1883
[Submit][Status][Discuss]

Description

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

Input

第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n)  m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n

Output

输出一行n个数字,表示原始序列经过m次变换后的结果

Sample Input

5 3

1 3

1 3

1 4

Sample Output

4 3 2 1 5

HINT

N,M<=100000

Source

RunID

  User Problem Result Memory Time Language Code_Length Submit_Time
1538282 ksq2013 3223 Accepted 5396 kb 2576 ms C++/Edit 2878 B 2016-07-08 20:57:17

区间翻转裸题,废话不多说,直接放代码:

  1. #include<cstdio>
  2. #include<iostream>
  3. #define INF 0x3f3f3f3f
  4. #define Key_value ch[ch[root][1]][0]
  5. using namespace std;
  6. bool rev[];
  7. int n,m,root,tot,size[],key[],pre[],ch[][];
  8. void NewNode(int &x,int father,int val)
  9. {
  10. x=++tot;
  11. size[x]=;
  12. key[x]=val;
  13. pre[x]=father;
  14. }
  15. void Update_Rev(int x)
  16. {
  17. rev[x]^=;
  18. swap(ch[x][],ch[x][]);
  19. }
  20. void Push_Up(int x)
  21. {
  22. size[x]=size[ch[x][]]+size[ch[x][]]+;
  23. }
  24. void Push_Down(int x)
  25. {
  26. if(rev[x]){
  27. Update_Rev(ch[x][]);
  28. Update_Rev(ch[x][]);
  29. rev[x]=;
  30. }
  31. }
  32. void build(int &x,int father,int l,int r)
  33. {
  34. if(l>r)return;
  35. int mid=(l+r)>>;
  36. NewNode(x,father,mid);
  37. build(ch[x][],x,l,mid-);
  38. build(ch[x][],x,mid+,r);
  39. Push_Up(x);
  40. }
  41. void Init()
  42. {
  43. NewNode(root,,INF);
  44. NewNode(ch[root][],root,INF);
  45. build(Key_value,ch[root][],,n);
  46. }
  47. int Get_Kth(int x,int k)
  48. {
  49. Push_Down(x);//mistaken codes;
  50. int t=size[ch[x][]]+;
  51. if(t==k)return x;
  52. if(t>k)return Get_Kth(ch[x][],k);
  53. return Get_Kth(ch[x][],k-t);
  54. }
  55. void Rotate(int x,int kind)
  56. {
  57. int y=pre[x];
  58. Push_Down(y);Push_Down(x);
  59. ch[y][!kind]=ch[x][kind];
  60. pre[ch[x][kind]]=y;
  61. if(pre[y])ch[pre[y]][ch[pre[y]][]==y]=x;//unfixed;
  62. pre[x]=pre[y];
  63. ch[x][kind]=y;
  64. pre[y]=x;
  65. Push_Up(y);
  66. }
  67. void Splay(int x,int goal)
  68. {
  69. Push_Down(x);
  70. while(pre[x]!=goal){
  71. if(pre[pre[x]]==goal){
  72. Push_Down(pre[x]);
  73. Push_Down(x);
  74. Rotate(x,ch[pre[x]][]==x);
  75. }
  76. else{
  77. int y=pre[x];
  78. int kind=ch[pre[y]][]==y;
  79. Push_Down(pre[y]);//mistaken codes&&一遇到向下的操作就Push_Down;
  80. Push_Down(y);//mistaken codes
  81. Push_Down(x);//mistaken codes
  82. if(ch[y][kind]==x){
  83. Rotate(x,!kind);
  84. Rotate(x,kind);
  85. }
  86. else{
  87. Rotate(y,kind);
  88. Rotate(x,kind);
  89. }
  90. }
  91. }
  92. Push_Up(x);
  93. if(goal==)root=x;
  94. }
  95. void Rev(int l,int r)
  96. {
  97. Splay(Get_Kth(root,l),);
  98. Splay(Get_Kth(root,r+),root);
  99. Update_Rev(Key_value);
  100. Push_Up(ch[root][]);
  101. Push_Up(root);
  102. }
  103. void dfs(int x)
  104. {
  105. if(!x)return;
  106. Push_Down(x);
  107. dfs(ch[x][]);
  108. if(<=key[x]&&key[x]<=n)printf("%d ",key[x]);
  109. dfs(ch[x][]);
  110. }
  111. int main()
  112. {
  113. scanf("%d%d",&n,&m);
  114. Init();
  115. for(int x,y;m;m--){
  116. scanf("%d%d",&x,&y);
  117. Rev(x,y);
  118. }dfs(root);
  119. return ;
  120. }

新splay模板上线,更简洁

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<limits.h>
  4. inline int Rin(){
  5. int x=,c=getchar(),f=;
  6. for(;c<||c>;c=getchar())
  7. if(!(c^))f=-;
  8. for(;c>&&c<;c=getchar())
  9. x=(x<<)+(x<<)+c-;
  10. return x*f;
  11. }
  12. struct node{
  13. node*ch[];
  14. int r,s,v;bool b;
  15. node (int v,node*k):v(v){
  16. r=rand();
  17. b=;s=;
  18. ch[]=ch[]=k;
  19. }
  20. void exc(node*&x,node*&y)
  21. {node*k=y;y=x;x=k;}
  22. void pu(){s=ch[]->s+ch[]->s+;}
  23. void pd(){
  24. if(b){
  25. b=;
  26. exc(ch[],ch[]);
  27. ch[]->b^=;
  28. ch[]->b^=;
  29. }
  30. }
  31. }*rt,*bf;
  32. inline void rot(node*&o,int d){
  33. node*k=o->ch[d^];o->ch[d^]=k->ch[d];k->ch[d]=o;
  34. o->pu();k->pu();o=k;
  35. }
  36. inline int cmk(node*o,int k){
  37. if(o->ch[]->s+==k)return -;
  38. if(o->ch[]->s>=k)return ;
  39. return ;
  40. }
  41. inline void ins(node*&o,int x){
  42. if(o==bf){o=new node(x,bf);return;}
  43. ins(o->ch[],x);
  44. o->ch[]->r>o->r?rot(o,):o->pu();
  45. }
  46. inline void splay(node*&o,int k){
  47. if(o==bf)return;
  48. o->pd();int d=cmk(o,k);
  49. if(!(d^))k-=o->ch[]->s+;
  50. if(d!=-&&o->ch[d]!=bf){
  51. node*p=o->ch[d];p->pd();
  52. int dd=cmk(p,k);
  53. if(dd!=-&&p->ch[dd]!=bf){
  54. int kk=(dd?k-p->ch[]->s-:k);
  55. splay(p->ch[dd],kk);
  56. d^dd?rot(o->ch[d],d):rot(o,d^);
  57. }
  58. rot(o,d^);
  59. }
  60. }
  61. inline node*mrg(node*l,node*r){
  62. splay(l,l->s);l->ch[]=r;
  63. l->pu();return l;
  64. }
  65. inline void slt(node*o,int k,node*&l,node*&r){
  66. if(!k){l=bf;r=o;return;}
  67. if(!(k^o->s)){l=o;r=bf;return;}
  68. splay(o,k);l=o;r=o->ch[];
  69. o->ch[]=bf;l->pu();
  70. }
  71. inline void ini(){
  72. bf=new node(,);
  73. bf->r=INT_MAX;bf->s=bf->v=;
  74. bf->ch[]=bf->ch[]=bf;rt=bf;
  75. ins(rt,);rt->r=-;
  76. }
  77. void opt(node*o){
  78. if(o==bf)return;
  79. o->pd();
  80. opt(o->ch[]);
  81. if(o->r!=-)printf("%d ",o->v);
  82. opt(o->ch[]);
  83. }
  84. int n,m;
  85. int main(){
  86. n=Rin(),m=Rin();ini();
  87. for(int i=;i<=n;i++)ins(rt,i);
  88. while(m--){
  89. int l=Rin(),r=Rin();
  90. node *ll,*rr,*mm;
  91. slt(rt,l,ll,rr);
  92. slt(rr,r-l+,mm,rr);
  93. mm->b^=;
  94. rt=mrg(mrg(ll,mm),rr);
  95. }
  96. opt(rt);
  97. return ;
  98. }

bzoj3223 文艺平衡树 (treap or splay分裂+合并)的更多相关文章

  1. BZOJ3223文艺平衡树——非旋转treap

    此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...

  2. [BZOJ3223]文艺平衡树 无旋Treap

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...

  3. BZOJ3223 文艺平衡树(splay)

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

  4. 【模板】平衡树——Treap和Splay

    二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...

  5. 文艺平衡树(区间splay)

    文艺平衡树(luogu) Description 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列. 其中需要提供以下操作:翻转一个区间,例如原有序序列是 5\ 4\ 3\ 2\ ...

  6. JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树

    http://172.20.6.3/Problem_Show.asp?id=1998 平衡树区间翻转的板子,重新写一遍,给自己码一个板子. #include<iostream> #incl ...

  7. [luogu3391][bzoj3223]文艺平衡树【splay】

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

  8. [bzoj3223]文艺平衡树(splay区间反转模板)

    解题关键:splay模板题. #include<cstdio> #include<cstring> #include<algorithm> #include< ...

  9. [bzoj3223]文艺平衡树——splay

    题意 你应当编写一个数据结构,支持以下操作: 反转一个区间 题解 我们把在数组中的位置当作权值,这样原序列就在这种权值意义下有序,我们考虑使用splay维护. 对于操作rev[l,r],我们首先把l- ...

随机推荐

  1. CoreDataManager-OC版-兼容iOS10以前的版本

    头文件: #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> /** CoreData管理器 */ ...

  2. 基于SolrCloud的内容搜索和热点推送

    ➠更多技术干货请戳:听云博客 什么是热点 我认为热点有时效性和受众面 用户关注从低到高再到低的内容 .有公共热点和分类热点.例如医辽养老全民关注,科技汽车等只有特定的人群关注. 推送的条件 搜索频次达 ...

  3. c中的关键字、标识符、注释

    一. 学习语法之前的提醒 1) C语言属于一门高级语言,其实,所有高级语言的基本语法组成部分都是一样的,只是表现形式不太一样 2) 就好像亚洲人和非洲人,大家都有人类的结构:2只 手.2只脚.1个头, ...

  4. myIsEqualToString

    BOOL myisEqualToString(NSString * str1 , NSString * str2){ //1.如果两个字符串,指针地址相等,就说明一定是相等 if(str1 == st ...

  5. GIT在iOS开发中的使用

    前言 在iOS开发中,很多公司对项目的版本控制管理都使用了git,当然也有部分公司使用的是svn.当年我最初接触的是svn,觉得使用起来挺方便的,但是每次切分支都需要下载一份新的代码起来,这实在太麻烦 ...

  6. .net C# 图片转Base64 Base64转图片

    //图片 转为 base64编码的文本 private void button1_Click(object sender, EventArgs e) { OpenFileDialog dlg = ne ...

  7. Sql Server之旅——终点站 nolock引发的三级事件的一些思考

    曾今有件事情让我记忆犹新,那年刚来携程不久,马上就被安排写一个接口,供企鹅公司调用他们员工的差旅信息,然后我就三下五除二的给写好 了,上线之后,大概过了一个月...DBA那边报告数据库出现大量锁超时, ...

  8. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

  9. 好用的排名函数~ROW_NUMBER(),RANK(),DENSE_RANK() 三兄弟

    排名函数三兄弟,一看名字就知道,都是为了排名而生!但是各自有各自的特色!以下一个例子说明问题!(以下栗子没有使用Partition By 的关键字,整个结果集进行排序) RANK 每个值一个排名,同样 ...

  10. MySQL 调优基础(一) CPU与进程

    一般而言,MySQL 的调优可以分为两个层面,一个是在MySQL层面上进行的调优,比如SQL改写,索引的添加,MySQL各种参数的配置:另一个层面是从操作系统的层面和硬件的层面来进行调优.操作系统的层 ...