【BZOJ-1552&3506】robotic sort&排序机械臂 Splay
1552: [Cerc2007]robotic sort
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 806 Solved: 329
[Submit][Status][Discuss]
Description

Input
输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000。第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号。
Output
输出共一行,N个用空格隔开的正整数P1,P2,P3…Pn,Pi表示第i次操作前第i小的物品所在的位置。 注意:如果第i次操作前,第i小的物品己经在正确的位置Pi上,我们将区间[Pi,Pi]反转(单个物品)。
Sample Input
3 4 5 1 6 2
Sample Output
HINT
Source
Solution
Splay基本操作...
我们首先对给出的序列排序,第一关键字是编号,第二关键字是时间戳,然后用splay去维护这个有顺序的序列就可以了
或者可以考虑维护min和pos
Splay要常写!调的跟*一样慢
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read()
{
int x=; char ch=getchar();
while (ch<'' || ch>'') {ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x;
}
#define MAXN 100010
int N,pos[MAXN];
struct Node{int id,t;}a[MAXN];
inline bool cmp(Node A,Node B) {return A.id==B.id? A.t<B.t:A.id<B.id;}
namespace SplayTree
{
int size[MAXN],root,sz,fa[MAXN],son[MAXN][]; bool rev[MAXN];
#define ls(x) son[x][0]
#define rs(x) son[x][1]
inline void Update(int now) {size[now]=size[ls(now)]+size[rs(now)]+;}
inline void PushDown(int now)
{
if (!rev[now]) return;
rev[ls(now)]^=; rev[rs(now)]^=; swap(ls(now),rs(now)); rev[now]=;
}
inline bool Right(int now) {return son[fa[now]][]==now;}
inline void rotate(int now)
{
PushDown(fa[now]); PushDown(now);
int f=fa[now],gf=fa[f],wh=Right(now);
son[f][wh]=son[now][wh^]; fa[son[f][wh]]=f;
fa[f]=now; son[now][wh^]=f; fa[now]=gf;
if (gf) son[gf][son[gf][]==f]=now;
Update(f); Update(now);
}
inline void splay(int now,int tar)
{
for (int f; (f=fa[now])!=tar; rotate(now))
if (fa[f]!=tar) rotate(Right(now)==Right(f)? f:now);
if (!tar) root=now;
}
inline int GetX(int k)
{
int x=root;
while ()
{
PushDown(x);
if (k<=size[ls(x)]) x=ls(x);
else if (k==size[ls(x)]+) return x;
else k-=size[ls(x)]+,x=rs(x);
}
return -;
}
inline int GetK(int x) {splay(x,); return size[ls(x)];}
inline int BuildTree(int l,int r,int last)
{
if (r<l) return ;
int mid=(l+r)>>,now=++sz;
pos[a[mid].id]=now; fa[now]=last;
int lson=BuildTree(l,mid-,now),rson=BuildTree(mid+,r,now);
son[now][]=lson; son[now][]=rson;
Update(now);
return now;
}
inline void Reverse(int l,int r) {splay(l,),splay(r,l); rev[ls(rs(root))]^=;}
inline void Init() {root=BuildTree(,N+,);}
}
int main()
{
N=read();
for (int i=,t=; i<=N+; i++) a[i].id=read(),a[i].t=++t;
a[].id=; a[N+].id=N+;
stable_sort(a+,a+N+,cmp);
for (int i=; i<=N; i++) a[a[i+].t+].id=i;
// for (int i=1; i<=N+2; i++) printf("%d ",a[i].id); puts("");
SplayTree::Init();
for (int i=; i<=N; i++)
{
int loc=SplayTree::GetK(pos[i]);
int x=SplayTree::GetX(i),y=SplayTree::GetX(loc+);
// printf("%d %d\n",x,y);
SplayTree::Reverse(x,y);
printf("%d%c",loc,i!=N? ' ':'\n');
}
return ;
}
和char哥,龙哥,连坐调splay...感觉智障++
【BZOJ-1552&3506】robotic sort&排序机械臂 Splay的更多相关文章
- [bzoj1552\bzoj2506][Cqoi2014]robotic sort 排序机械臂_非旋转Treap
robotic sort 排序机械臂 bzoj-1552 bzoj-2506 Cqoi-2014 题目大意:给定一个序列,让你从1到n,每次将[1,p[i]]这段区间反转,p[i]表示整个物品权值第i ...
- BZOJ 1552: [Cerc2007]robotic sort( splay )
kpm大神说可以用块状链表写...但是我不会...写了个splay.... 先离散化 , 然后splay结点加个min维护最小值 , 就可以了... ( ps BZOJ 3506 题意一样 , 双倍经 ...
- bzoj 1552: [Cerc2007]robotic sort
1552: [Cerc2007]robotic sort Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1198 Solved: 457[Submit] ...
- [BZOJ3506] [Cqoi2014] 排序机械臂 (splay)
Description 同OJ1552 Input Output Sample Input Sample Output HINT Source Solution Q:哎不是同一道题吗为什么分两篇博客来 ...
- 洛谷P3165 [CQOI2014]排序机械臂 Splay维护区间最小值
可以将高度定义为小数,这样就完美的解决了优先级的问题. Code: #include<cstdio> #include<algorithm> #include<cstri ...
- 【BZOJ】【1552】【Cerc2007】robotic sort / 【3506】【CQOI2014】排序机械臂
Splay 离散化+Splay维护序列…… 好吧主要说一下我做这道题遇到的几个错误点: 1.离散化 2.由于找到的这个数的位置一定是大于等于 i 的,所以其实在把它splay到根以后,i 结点只能sp ...
- [BZOJ 1552] 排序机械臂
Splay大法是坠吼滴! 1552: [Cerc2007]robotic sort Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 436 Solved: ...
- 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)
点此看题面 大致题意: 给你\(n\)个数.第一次找到最小值所在位置\(P_1\),翻转\([1,P_1]\),第二次找到剩余数中最小值所在位置\(P_2\),翻转\([2,P_2]\),以此类推.求 ...
- 【BZOJ3506】排序机械臂(Splay)
[BZOJ3506]排序机械臂(Splay) 题面 神TMBZOJ没有题面,感谢SYC的题面 洛谷的题面也不错 题解 对于每次旋转的物体 显然可以预处理出来 现在只要模拟旋转操作就行了 至于在哪里放标 ...
随机推荐
- python处理经过gzip压缩的网页内容
Python在进行网页抓取时,有时会获取到经过gzip压缩后的数据(体积小,传输快),导致无法阅读和使用. 如图所示,为http原始报文.可以看到,header区域的“Content-Encoding ...
- 053医疗项目-模块五:权限设置-将用户操作权限写入Session
权限管理指的是用户授权,与拦截器没有关系.拦截器只是一个技术,也可以用别的技术来实现的.别人问你权限管理,可不要和人家说什么拦截器.要说用户授权 前一篇文章是把实现了不同的用户呈现不用的菜单.这一篇文 ...
- JS 中如何判断 undefined 和 null
JS 中如何判断 undefined JavaScript 中有两个特殊数据类型:undefined 和 null,下节介绍了 null 的判断,下面谈谈 undefined 的判断. 以下是不正确的 ...
- Openjudge 1.3-04 垂直直方图
04:垂直直方图 查看 总时间限制: 1000ms 内存限制: 65536kB 描述 输入4行全部由大写字母组成的文本,输出一个垂直直方图,给出每个字符出现的次数.注意:只用输出字符的出现次数,不用输 ...
- hadoop资料收集
大数据时代——为什么用hadoop hadoop应用场景 Hadoop一般用在哪些业务场景? Hadoop虽然强大,但不是万能的
- VMware Fusion DHCP方式下如何指定虚拟机IP地址
默认情况下,vmware fusion中的虚拟机,网卡设置成dhcp(动态分配 )时,会分配一个IP地址,但这个IP通常很难记,如果我们想为某台虚拟机挑一个好记的IP地址,可以按如下步骤操作: 命令行 ...
- SEO初级优化--HTML、CSS、JS
HTML: 1.标签的有开有合. 2.避免冗余代码,例如去除空格字符. 3.合理利用标签语义化. 4.合理的嵌套规则,避免行元素内嵌套块元素. 5.img标签内需要添加title属性和alt属性. 6 ...
- K-means算法及文本聚类实践
K-Means是常用的聚类算法,与其他聚类算法相比,其时间复杂度低,聚类的效果也还不错,这里简单介绍一下k-means算法,下图是一个手写体数据集聚类的结果. 基本思想 k-means算法需要事先指定 ...
- 一步一步学习ABP项目系列文章目录
1.概述 基于DDD的.NET开发框架 - ABP初探 基于DDD的.NET开发框架 - ABP分层设计 基于DDD的.NET开发框架 - ABP模块设计 基于DDD的.NET开发框架 - ABP启动 ...
- 如何采集QQ群中所有成员QQ号码
安装Google Chrome浏览器 安装Google插件:Regex Scraper 在群成员页面点击Regex 插件, 粘贴上这个代码 text_overflow">([\S\s] ...