伸展树。。。

  赤果果地抄袭雷哥的代码:http://www.cnblogs.com/jianglangcaijin/archive/2013/01/21/2869148.html

  题意:输入n,m。给你n个数,初始排列是1到n,然后有m个操作,每次操作给两个数L,R,把(L,R)区间上的数的顺序颠倒,输出最终的顺序。

  伸展树就是二叉查找排序数,一个节点的左子树上的数都比它小,右子树上的数比它大。这道题要在首尾加上哨兵,即有n+2个数,操作(L,R),就是把L-1旋转至根节点,然后把R+1旋转至L-1的右子树,那么R+1的左子树就是区间(L,R),然后把这个区间颠倒。

  因为是第一次看伸展树的代码,雷哥定义的数组看了好大一会儿才知道干吗用的。

  c[f][0]是节点f的左子树,c[f][1]就是节点f的右子树。p[x]是节点x的父节点,s[x]是以节点x为跟的数的节点数,sign[x]表示节点x是否颠倒,和线段树有点像。

下面就贴代码了,函数的功能也在代码里注释。

#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;const int N=130005;
int n,m;
int root;
int sign[N],c[N][2],s[N],p[N];
void down(int x)          //将以节点x为根的树颠倒
{if(!sign[x])    return ;sign[x]=0;swap(c[x][0],c[x][1]);sign[c[x][0]]^=1;sign[c[x][1]]^=1;
}
void update(int f,int x,int flag)//建立节点x,使它的父节点为f,flag表示它是左子树还是右子树
{p[x]=f;if(!f)  return ;c[f][flag]=x;s[f]=1+s[c[f][0]]+s[c[f][1]];
}
int build(int L,int R)       //建树
{if(L>R) return 0;int m=(L+R)>>1;update(m,build(L,m-1),0);update(m,build(m+1,R),1);return m;
}
void rotate(int x)         //旋转节点x
{int P=p[x],G=p[P];if(c[P][0]==x)//如果x是P的左子树{update(P,c[x][1],0);//x的右子树转为P的左子树update(x,P,1);//P成为x的右子树update(G,x,!(c[G][0]==P));}else{update(P,c[x][0],1);update(x,P,0);update(G,x,!(c[G][0]==P));}
}
void splay(int x,int &goal)
{int P=p[x],G=p[P],limit=p[goal];while(P!=limit){if(G!=limit && (c[G][0]==P)==(c[P][0]==x))  rotate(P);rotate(x);P=p[x];G=p[P];}goal=x;down(goal);
}
int select(int x)
{int t=root;while(1){down(t);if(s[c[t][0]]+1==x)    break;if(s[c[t][0]]+1>x)     t=c[t][0];else            x-=s[c[t][0]]+1,t=c[t][1];}return t;
}
int main()
{scanf("%d%d",&n,&m);root=build(1,n+2);int l,r;while(m--){scanf("%d%d",&l,&r);int r1=select(l);int r2=select(r+2);splay(r1,root);splay(r2,c[r1][1]);int x=c[root][1];x=c[x][0];sign[x]^=1;}for(int i=2;i<=n+1;i++)  printf("%d ",select(i)-1);puts("");return 0;
}

转载于:https://www.cnblogs.com/yongren1zu/p/3286192.html

SGU 187 Twist and whirl - want to cheat相关推荐

  1. SGU 187.Twist and whirl - want to cheat( splay )

    维护一个支持翻转次数M的长度N的序列..最后输出序列.1<=N<=130000, 1<=M<=2000 splay裸题... ------------------------- ...

  2. SGU 187 - Twist and whirl -- want to cheat

    原题地址:http://acm.sgu.ru/problem.php?contest=0&problem=187 太开心啦!!!!这道题从2013年开始困扰我!!今天晚上第四次下定决心把它写一 ...

  3. SGU 187 Twist and whirl - want to cheat(splay)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=187 题意:给出一个长度为n的数列,每次将某个区间的数字翻转.求最后的序列. 思路: ...

  4. 【Splay】[SGU 187]Twist and whirl - want to cheat

    这道题真是我见过的最坑的平衡树的题目.... time limit per test: 0.25 sec. memory limit per test: 4096 KB 这个也太小了吧! 题目大意就是 ...

  5. sgu 187 Twist and whirl - want to cheat 伸展树(splay)

    裸的区间翻转..直接写个splay就行... #include <iostream> #include <cstdio> #include <algorithm> ...

  6. SGU 187.Twist and whirl - want to cheat

    splay 不过竟然用reverse一发水过了... 调用STL的代码:(156ms) #include <iostream> #include <cstdio> #inclu ...

  7. 史上最全的SGU题目分类

    由于SGU上神题遍地,特列此表,便于训练时分类训练. 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traffic Lights 最短路 104 Little Shop ...

  8. 《题目与解读》红书 训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》

    虽然2012年出版的老书了,但是是由三次世界冠军的上海交大ACM队出版的书籍,选择的题目是ACM经典中的经典,书中有非常详细的题解,可以学到很多东西,值得一刷. 目录 第一部分 第一章 数学 1.1 ...

  9. SGU 286 Ancient decoration(Euler路径+二分匹配)

    http://acm.sgu.ru/problem.php?contest=0&problem=286 先找欧拉回路,再做二分匹配,输出匹配 有一道题和这个很像:HDU 3551 Hard P ...

最新文章

  1. 什么是textRNN?有什么用途?结构是什么样子的?
  2. The Simple Life
  3. nullnullDataTable 排序
  4. jpa一对多映射案例
  5. 如何干掉网易云音乐?这儿有个可行性未知的技术方案
  6. 如何处理SAP Fiori Launchpad错误消息:Could not start the app due to a configuration problem
  7. 第一章python绝对温标身体质量指数bmi
  8. opencv绘制基本形状的二值图像
  9. 惠普win7驱动_hp打印机驱动如何安装 hp打印机驱动安装方法【步骤详解】
  10. RG-IS2700G工业交换机ERPS技术解析
  11. 会计专业与计算机专业结合复合型,对会计专业学生学习计算机的建议
  12. python布尔值使用_Python布尔值--True和False
  13. 微信二次分享解决方案
  14. linux执行一个可执行文件,不同Linux系统下同一个可执行文件执行有关问题
  15. 复合索引 /多列索引 /联合索引 /组合索引?????
  16. Python 并行编程教程 | Lynda教程 中文字幕
  17. python积木编程软件_童心制物慧编程全新 Python 编辑器正式上线
  18. 前端-html-01
  19. java程序员必看书籍
  20. 单片机利用Proteus进行仿真点亮一个LED灯(C语言和汇编语言)

热门文章

  1. 人脸识别-闭集测试指标CMC曲线
  2. 【踩坑实录】hive删除字段报错
  3. html中如何把一个div变成三角形,是否可以使用CSS从div中切出三角形部分?
  4. WRL 类库项目模板
  5. 人工智能——阿尔法元
  6. Tomcat启动报错-failed setting ip_ttl
  7. 虚拟机+Ubuntu18.04+ORB_SLAM3+ROS环境配置(配置环境的过程以及途中出现的错误,解决方法)
  8. linux系统命令vi存盘退出的其他方法
  9. Foxmail只能接收邮件,不能发邮件,Mcafee需设置
  10. 2019中国(深圳)IT领袖峰会大咖云集 引爆IT朋友圈...