P1729 文艺平衡树
时间: 1000ms / 空间: 131072KiB / Java类名: Main

背景

此为平衡树系列第二道:文艺平衡树

描述

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

输入格式

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

输出格式

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

测试样例1

输入

5 3 
1 3 
1 3 
1 4

输出

4 3 2 1 5

备注

n,m<=100000 
 
题解:
Splay
复习一下Splay。
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define MAXN 100010
  4. struct node
  5. {
  6. int left,right,size,val;
  7. }tree[MAXN];
  8. int rev[MAXN],father[MAXN],a[MAXN];
  9. int read()
  10. {
  11. int s=,fh=;char ch=getchar();
  12. while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
  13. while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
  14. return s*fh;
  15. }
  16. void Pushup(int k)
  17. {
  18. tree[k].size=tree[tree[k].left].size+tree[tree[k].right].size+;
  19. }
  20. void Pushdown(int k)
  21. {
  22. int l=tree[k].left,r=tree[k].right;
  23. if(rev[k]!=)
  24. {
  25. rev[k]^=;rev[l]^=;rev[r]^=;
  26. swap(tree[k].left,tree[k].right);
  27. }
  28. }
  29. void Build(int l,int r,int f)
  30. {
  31. if(l>r)return;
  32. int now=l,last=f;
  33. if(l==r)
  34. {
  35. father[now]=last;tree[now].size=;tree[now].val=a[l];
  36. if(l<f)tree[last].left=now;
  37. else tree[last].right=now;
  38. return;
  39. }
  40. int mid=(l+r)/;
  41. now=mid;
  42. Build(l,mid-,mid);Build(mid+,r,mid);
  43. tree[now].val=a[mid];
  44. father[now]=last;Pushup(now);
  45. if(mid<f)tree[last].left=now;
  46. else tree[last].right=now;
  47. }
  48. void Rotate(int x,int &root)
  49. {
  50. int y=father[x],z=father[y];
  51. if(y==root)root=x;
  52. else
  53. {
  54. if(tree[z].left==y)tree[z].left=x;
  55. else tree[z].right=x;
  56. }
  57. if(tree[y].left==x)
  58. {
  59. father[x]=z;father[y]=x;tree[y].left=tree[x].right;tree[x].right=y;father[tree[y].left]=y;
  60. }
  61. else
  62. {
  63. father[x]=z;father[y]=x;tree[y].right=tree[x].left;tree[x].left=y;father[tree[y].right]=y;
  64. }
  65. Pushup(y);Pushup(x);
  66. }
  67. void Splay(int x,int &root)
  68. {
  69. int y,z;
  70. while(x!=root)
  71. {
  72. y=father[x];z=father[y];
  73. if(y!=root)
  74. {
  75. if((tree[y].left==x)^(tree[z].left==y))Rotate(x,root);
  76. else Rotate(y,root);
  77. }
  78. Rotate(x,root);
  79. }
  80. }
  81. int Find(int k,int rank)
  82. {
  83. Pushdown(k);
  84. int l=tree[k].left,r=tree[k].right;
  85. if(rank==tree[l].size+)return k;
  86. if(rank<=tree[l].size)return Find(l,rank);
  87. else return Find(r,rank-tree[l].size-);
  88. }
  89. int main()
  90. {
  91. int n,m,i,nn,s1,s2,x,y,z,rt;
  92. n=read();m=read();nn=n;
  93. for(i=;i<=n+;i++)a[i]=i-;
  94. rt=(+n+)/;Build(,n+,);
  95. for(i=;i<=m;i++)
  96. {
  97. s1=read();s2=read();
  98. x=Find(rt,s1);y=Find(rt,s2+);
  99. Splay(x,rt);Splay(y,tree[x].right);
  100. z=tree[y].left;rev[z]^=;
  101. }
  102. for(i=;i<=n;i++)
  103. {
  104. //printf("%d ",Find(rt,i)-1);
  105. x=Find(rt,i);y=Find(rt,i+);
  106. Splay(x,rt);Splay(y,tree[x].right);
  107. z=tree[y].left;
  108. printf("%d ",tree[z].val);
  109. }
  110. fclose(stdin);
  111. fclose(stdout);
  112. return ;
  113. }

Tyvj P1729 文艺平衡树 Splay的更多相关文章

  1. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Sta ...

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

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

  3. bzoj 3223: Tyvj 1729 文艺平衡树 (splay)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...

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

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

  5. 【BZOJ3223】 Tyvj 1729 文艺平衡树 Splay

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

  6. bzoj 3223/tyvj 1729 文艺平衡树 splay tree

    原题链接:http://www.tyvj.cn/p/1729 这道题以前用c语言写的splay tree水过了.. 现在接触了c++重写一遍... 只涉及区间翻转,由于没有删除操作故不带垃圾回收,具体 ...

  7. bzoj3223: Tyvj 1729 文艺平衡树 splay裸题

    splay区间翻转即可 /************************************************************** Problem: 3223 User: walf ...

  8. BZOJ - 3223 Tyvj 1729 文艺平衡树 (splay/无旋treap)

    题目链接 splay: #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f ...

  9. BZOJ 3223 Tyvj 1729 文艺平衡树 | Splay 维护序列关系

    题解: 每次reverse(l,r) 把l-1转到根,r+1变成他的右儿子,给r+1的左儿子打个标记就是一次反转操作了 每次find和dfs输出的时候下放标记,把左儿子和右儿子换一下 记得建树的时候建 ...

随机推荐

  1. 使用ajaxFileUpload实现异步上传图片

    index.html <head runat="server"> <title></title> <script src="jq ...

  2. Oracle 插入数据

    6个柜面交易 打印修改--050101 delete from tran_prints where tran_id = (select id from tran where code='050101' ...

  3. sublime c++ builder

    rt, mark { "cmd": ["g++", "${file}", "-o", "${file_path ...

  4. 【JSF框架】 是一种标准

    典型的JSF应用程序包含下列部分: 一组JSP页面 一组后台bean(为在一个页面上的UI组件定义的属性和函数的JavaBean组件) 应用程序配置资源文件(定义页面导航规则.配置bean和其它的自定 ...

  5. 在Linux上安装Memcached服务

    下载并安装Memcache服务器端服务器端主要是安装memcache服务器端.下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz ...

  6. Linux下配置jdk1.7

    第一步:下载jdk-7-linux-i586.tar.gz wget -c http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-i586 ...

  7. SQL中Case的使用方法(上篇)(转)

    http://www.cnblogs.com/fxgachiever/archive/2010/09/09/1822106.html Case具有两种格式.简单Case函数和Case搜索函数. --简 ...

  8. [状压dp]HDOJ3182 Hamburger Magi

    题意 大致是: 有n个汉堡 m块钱  (n<=15) 然后分别给n个汉堡的能量 再分别给n个汉堡所需的花费 然后下面n行 第i行有x个汉堡要在i汉堡之前吃 然后给出这x个汉堡的编号 输出 能获得 ...

  9. easyui源码翻译1.32---ProgressBar(进度条)

    前言 使用$.fn.progressbar.defaults重写默认值对象.下载该插件翻译源码 进度条提供了一个反馈显示一个长时间运行的操作进展.可以更新的进展条,让用户知道当前正在执行操作. 源码 ...

  10. C++中为什么要用虚函数、指针或引用才能实现多态?

    原文链接:http://blog.csdn.net/zoopang/article/details/14071779 学过C++的都知道,要实现C++的多态性必须要用到虚函数,并且还要使用引用或者指针 ...