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 ,N,M<=100000

Output

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

Sample Input

5 3

1 3

1 3

1 4

Sample Output

4 3 2 1 5


splay区间操作裸题,区间操作方法请见浅谈算法——splay

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #define inf 0x7f7f7f7f
  7. using namespace std;
  8. typedef long long ll;
  9. typedef unsigned int ui;
  10. typedef unsigned long long ull;
  11. inline int read(){
  12. int x=0,f=1;char ch=getchar();
  13. for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
  14. for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
  15. return x*f;
  16. }
  17. const int N=1e5;
  18. int n,m;
  19. struct Splay{
  20. #define T(x) (tree[f[x]][1]==x)
  21. int tree[N+10][2],f[N+10],size[N+10];
  22. bool flag[N+10];
  23. int len,root;
  24. void updata(int x){size[x]=size[tree[x][0]]+size[tree[x][1]]+1;}
  25. void build(int x){
  26. root=x+1;
  27. for (int i=1;i<=x;i++) f[i]=i+1,size[i]=i+1,tree[i+1][0]=i;
  28. tree[1][0]=x+2,f[x+2]=1,size[x+2]=1;
  29. size[x+1]=x+2;
  30. }
  31. void move(int x){
  32. int fa=f[x],son=tree[x][T(x)^1];
  33. tree[x][T(x)^1]=fa;
  34. tree[fa][T(x)]=son;
  35. if (son) f[son]=fa;
  36. f[x]=f[fa];
  37. if (f[x]) tree[f[x]][T(fa)]=x;
  38. f[fa]=x;
  39. updata(fa),updata(x);
  40. }
  41. void splay(int x){
  42. while (f[x]){
  43. if (f[f[x]]) T(x)==T(f[x])?move(f[x]):move(x);
  44. move(x);
  45. }
  46. root=x;
  47. }
  48. void pushdown(int x){
  49. if (!flag[x]) return;
  50. swap(tree[x][0],tree[x][1]);
  51. flag[tree[x][0]]^=1;
  52. flag[tree[x][1]]^=1;
  53. flag[x]=0;
  54. }
  55. int find(int x,int i){
  56. pushdown(i);
  57. if (size[tree[i][0]]+1==x) return i;
  58. if (x<=size[tree[i][0]]) return find(x,tree[i][0]);
  59. return find(x-size[tree[i][0]]-1,tree[i][1]);
  60. }
  61. void print(int x){
  62. if (!x) return;
  63. pushdown(x);
  64. print(tree[x][0]);
  65. if (x<=n) printf("%d ",x);
  66. print(tree[x][1]);
  67. }
  68. void work(){
  69. int x=read(),y=read();
  70. x=find(x,root),splay(x);
  71. y=find(y+2,root),splay(y);
  72. if (f[x]!=root) move(x);
  73. flag[tree[x][1]]^=1;
  74. }
  75. }T;
  76. int main(){
  77. n=read(),m=read();
  78. T.build(n);
  79. for (int i=1;i<=m;i++) T.work();
  80. T.print(T.root);
  81. return 0;
  82. }

[BZOJ3223/Tyvj1729]文艺平衡树的更多相关文章

  1. [BZOJ3223] [Tyvj1729] 文艺平衡树 (splay)

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

  2. [Bzoj3223][Tyvj1729] 文艺平衡树(splay/无旋Treap)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3223 平衡树处理区间问题的入门题目,普通平衡树那道题在维护平衡树上是以每个数的值作为维护 ...

  3. BZOJ3223:文艺平衡树——超详细题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面复制于洛谷. 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写 ...

  4. 【BZOJ3223】文艺平衡树(Splay)

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

  5. 【bzoj3223】文艺平衡树

    #include<bits/stdc++.h> #define N 300005 #define rat 4 using namespace std; struct Node{ int s ...

  6. [BZOJ3223]Tyvj 1729 文艺平衡树

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

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

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

  8. bzoj3223 文艺平衡树 (treap or splay分裂+合并)

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

  9. bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)

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

随机推荐

  1. MT6753 使用nt35596s 由于液晶极化出现的闪屏问题解决思路

    咨询屏厂那边FAE , 若是液晶极化相关的问题,下面三种场景下比较容易复现现象,请协助在目前的故障机上做压力测试: 1.反复开关机(1000次), 2.按power键休眠和唤醒(1000次), 3.反 ...

  2. 2.4 选择第k大的元素 selection

    1.目标:找到N个元素中,第k大的数. 例如:max是k=N--1:min是k=0:median是k=N/2 2.Quick-select 借鉴了快速排序的思想 (1)利用partition保证: ① ...

  3. Xterm256终端颜色的名称

    hi x016_Grey0 ctermfg=16 guifg=#000000 "rgb=0,0,0 hi x017_NavyBlue ctermfg=17 guifg=#00005f &qu ...

  4. iLBC 压缩比

    *---------------------------------------------------* *                                             ...

  5. hnuun 11544 小明的烦恼——找字符串(求环形字符串的最小最大字典序)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11544&courseid=0 最小最大表示法: 求环 ...

  6. MongoDB小结05 - update【$set & $unset】

    用$set指定一个键的值,如果不存在,就创建它.这对更新模式或者增加用户定义很有帮助. db.user.insert({"name":"codingwhy.com&quo ...

  7. WinExec可能会引起消息重入

    WinExec不仅会造成延迟,并且还会引起消息的重入. 以下是调用堆栈: WinvoiceCC.exe!CWinvoiceCCDlg::OnMsgHttpReq(unsigned int wParam ...

  8. 初探FFT在数字图像处理中的应用(fft2函数的用法)

    初探FFT在数字图像处理中的应用 一般FFT在通信等领域都做的一维变换就能够了.可是在图像处理方面,须要做二维变换,这个时候就须要用到FFT2. 在利用Octave(或者matlab)里面的fft2( ...

  9. Android lollipop 更新问题

    非常多朋友都说lollipop出来想试用一下,结果在网官下载的android studio 都是20版本号,也没有看见更新到android 5.0. 我也在网上狂了一下,收集到一个代理地址目測能够用, ...

  10. IE6\7\8 :last-child 和 :first-chlid 兼容

    IE9以下不支持last-child ,只支持first-child,边框尽量用上边框.