BZOJ_1552_[Cerc2007]robotic sort_splay
BZOJ_1552_[Cerc2007]robotic sort_splay
题意:

分析:
splay维护区间操作
可以先把编号排序,给每个编号分配一个固定的点,映射过去
查找编号的排名时先找到这个点,找出到根的路径
从上至下pushdown标记,顺便求出这个点的排名
然后翻转啥的就好做了
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100050
#define ls ch[p][0]
#define rs ch[p][1]
#define get(x) (ch[f[x]][1]==x)
int a[N],ch[N][2],f[N],siz[N],val[N],turn[N],rt;
int n,w[N];
struct A{
int num,id;
}b[N];
bool cmp(const A &x,const A &y)
{
if(x.num==y.num)return x.id<y.id;
return x.num<y.num;
}
void print(int p)
{
if(!p)return ;
if(ls)print(ls);
printf("p=%d ,val[p]=%d ",p,val[p]);
if(rs)print(rs);
}
void pushup(int p){ if(p) siz[p]=siz[ls]+siz[rs]+1; }
void pushdown(int p)
{
if(turn[p])
{
turn[p]=0;
turn[ls]^=1;turn[rs]^=1;
swap(ch[ls][0],ch[ls][1]);
swap(ch[rs][0],ch[rs][1]);
}
}
void rotate(int x)
{
int y=f[x],z=f[y],k=get(x);
ch[y][k]=ch[x][k^1];f[ch[y][k]]=y;ch[x][k^1]=y;
f[y]=x;f[x]=z;if(z)ch[z][ch[z][1]==y]=x;
pushup(y),pushup(x);if(rt==y)rt=x;
}
void splay(int x,int y)
{
for(int fa;(fa=f[x])!=y;rotate(x))
if(f[fa]!=y)
rotate((get(x)==get(fa)) ? fa : x);
}
int find(int x)
{
int p=rt;
while(1){
pushdown(p);
if(x<=siz[ls])p=ls;
else{
x-=siz[ls]+1;
if(!x)return p;
p=rs;
}
}
}
void build(int fa,int l,int r,int flg)
{
if(l>r)return ;
int mid=l+r>>1;
ch[fa][flg]=mid;
f[mid]=fa;
siz[mid]=1;
val[mid]=a[mid-1];
w[a[mid-1]]=mid;
build(mid,l,mid-1,0);
build(mid,mid+1,r,1);
pushup(mid);
}
int getrank(int p)
{
int cnt=0;
while(p)
{
a[++cnt]=p;
p=f[p];
}
int i;
for(i=cnt;i;i--) pushdown(a[i]);
splay(a[1],0);
return siz[ch[a[1]][0]];
}
void reverse(int x,int p)
{
x=find(x);
p=find(p);
splay(x,0);
splay(p,rt);
turn[ls]=1;
swap(ch[ls][0],ch[ls][1]);
pushup(p);pushup(x);
}
int main()
{
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&b[i].num);
b[i].id=i;
}
sort(b+1,b+n+1,cmp);
for(i=1;i<=n;i++)
{
a[b[i].id]=i;
}
build(0,1,n+2,1);
rt=n+3>>1;
for(i=1;i<=n;i++)
{
int tmp=getrank(w[i]);
if(i-1)printf(" %d",tmp);
else printf("%d",tmp);
reverse(i,tmp+2);
}
}
BZOJ_1552_[Cerc2007]robotic sort_splay的更多相关文章
- [BZOJ1552][Cerc2007]robotic sort
[BZOJ1552][Cerc2007]robotic sort 试题描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数 ...
- BZOJ 1552: [Cerc2007]robotic sort( splay )
kpm大神说可以用块状链表写...但是我不会...写了个splay.... 先离散化 , 然后splay结点加个min维护最小值 , 就可以了... ( ps BZOJ 3506 题意一样 , 双倍经 ...
- 【BZOJ1552】[Cerc2007]robotic sort Splay
[BZOJ1552][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N ...
- bzoj 1552: [Cerc2007]robotic sort
1552: [Cerc2007]robotic sort Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1198 Solved: 457[Submit] ...
- 【bzoj1552/3506】[Cerc2007]robotic sort splay翻转,区间最值
[bzoj1552/3506][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. ...
- [Cerc2007]robotic sort
splay区间反转练手题 #include <iostream> #include <cstdio> #include <algorithm> using name ...
- 洛谷 P4402 BZOJ1552 / 3506 [Cerc2007]robotic sort 机械排序
FHQ_Treap 太神辣 蒟蒻初学FHQ_Treap,于是来到了这道略显板子的题目 因为Treap既满足BST的性质,又满足Heap的性质,所以,对于这道题目,我们可以将以往随机出的额外权值转化为每 ...
- BZOJ 1552/1506 [Cerc2007]robotic sort
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1552 [分析] 这题哇!又有翻转操作...每次要输出第几个?是吧... 所以又要用Spla ...
- 【bzoj1552】[Cerc2007]robotic sort
题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开的 ...
随机推荐
- AI之微信跳一跳
需要环境:1,Python3.6 2,android手机 3,ADB驱动,下载地址https://adb.clockworkmod.com/ 步骤: 配置Python3,ADB安装目录到环境变量pat ...
- ORACLE之TO_DATE (转载)
转自 http://www.cnblogs.com/anran_guojianjun/archive/2009/09/11/1564535.html 一.在使用Oracle的to_date函数来做日期 ...
- HTMLConverter使用实例(转)
---- 本来,Applet的概念相当简单——只要在Web页面中加入一个< APPLET >标记就可以了.浏览器一遇到这个标记,就会下载对应的 Applet类文件,并启动自己的解释器运行这 ...
- UML图中类之间的关系
类图中的关系大致一下几种 l 泛化 l 关联 l 依赖 l 组合 l 聚合 泛化 泛化是子集和超集的关系,常使用继承和实现来表示: 继承:子类到超类的实线和空心三角箭头表示 实现:子类到超类的虚线和空 ...
- Oracle入门《Oracle介绍》第一章1-3 Oracle 逻辑组件
一.数据库的逻辑结构是从逻辑的角度分析数据库的组成.Oracle 的逻辑组件包括: 1.表空间 表空间是数据库中最大的逻辑单位,一个 Oracle 数据库至少包含一个表空间,就是名为SYSTEM的系统 ...
- meta 标签知识汇总
概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 web 服务. -- W3School ...
- windows + maven + eclipse
一处教程:http://www.yiibai.com/maven/maven_overview.html Maven中央仓库信息速查:http://maven.outofmemory.cn/ ...
- ScalaPB(3): gRPC streaming
接着上期讨论的gRPC unary服务我们跟着介绍gRPC streaming,包括: Server-Streaming, Client-Streaming及Bidirectional-Streami ...
- linux下svn(subversion)服务端添加工程及配置权限
linux下svn(subversion)服务端添加工程及配置权限 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/9010507.html 此篇我只是将所做过的 ...
- Android Zxing 转换竖屏扫描且提高识别率
最近的一个Android需要用到扫码功能,用的是Zxing开源库.Zxing的集成就不说了,但是Zxing默认的是横屏扫码,在实际生产中并不适用,需要改为竖屏扫描. 转竖屏步骤: 1>. And ...