robotic sort 排序机械臂 bzoj-1552 bzoj-2506 Cqoi-2014

题目大意:给定一个序列,让你从1到n,每次将[1,p[i]]这段区间反转,p[i]表示整个物品权值第i小的。

注释:$1\le n\le 10^5$。

想法:非旋转Treap裸题,随题目要求。只需要非旋转Treap的最基本的函数和一个查询排名的函数即可。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
#define mp make_pair
using namespace std;
typedef pair<int,int> par;
struct pig
{
int val,id,fin_val;
}t[N];
int n;
inline bool cmp1(pig x,pig y)
{
if(x.val!=y.val)return x.val<y.val;
return x.id<y.id;
}
inline bool cmp2(pig x,pig y)
{
return x.id<y.id;
}
struct Node
{
int ls,rs,size,key,fa;
bool turn;
}a[N];
int root;
inline void update(int x)
{
int ls=a[x].ls,rs=a[x].rs;
a[x].size=1;
if(ls)a[x].size+=a[ls].size;
if(rs)a[x].size+=a[rs].size;
}
inline void pushdown(int x)
{
if(a[x].turn)
{
swap(a[x].ls,a[x].rs);
if(a[x].ls)a[a[x].ls].turn^=1;
if(a[x].rs)a[a[x].rs].turn^=1;
a[x].turn=0;
}
}
int merge(int x,int y)
{
pushdown(x);pushdown(y);
if(!x||!y)return x|y;
if(a[x].key>a[y].key)
{
a[x].rs=merge(a[x].rs,y);
a[a[x].rs].fa=x;
update(x);
return x;
}
a[y].ls=merge(x,a[y].ls);
a[a[y].ls].fa=y;
update(y);
return y;
}
par split(int x,int k)
{
pushdown(x);
if(!k)return mp(0,x);
int ls=a[x].ls,rs=a[x].rs;
if(k==a[ls].size)
{
a[ls].fa=0;
a[x].ls=0;update(x);
return mp(ls,x);
}
if(k==a[ls].size+1)
{
a[rs].fa=0;
a[x].rs=0;update(x);
return mp(x,rs);
}
if(k<a[ls].size)
{
par t=split(ls,k);
a[t.first].fa=0,a[t.second].fa=x;
a[x].ls=t.second;
update(x);
return mp(t.first,x);
}
par t=split(rs,k-a[ls].size-1);
a[t.first].fa=x,a[t.second].fa=0;
a[x].rs=t.first;
update(x);
return mp(x,t.second);
}
int z[N],top;
int getrank(int x)
{
top=0;int t=x;
while(t)z[++top]=t,t=a[t].fa;
while(top)pushdown(z[top--]);
int ans=0,flag=1;
while(x)
{
if(flag)ans+=a[a[x].ls].size+1;
flag=(x==a[a[x].fa].rs);
x=a[x].fa;
}
return ans;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&t[i].val),t[i].id=i;
sort(t+1,t+n+1,cmp1);
for(int i=1;i<=n;i++)t[i].fin_val=i;
sort(t+1,t+n+1,cmp2);
for(int i=1;i<=n;i++)
{
int pos=t[i].fin_val;
a[pos].key=rand(),a[pos].size=1;
root=merge(root,pos);
}
for(int i=1;i<=n;i++)
{
int rank=getrank(i);
printf("%d",rank);
if(n-i)putchar(' ');
if(i==rank)continue;
par t2=split(root,rank),t1=split(t2.first,i-1);
a[t1.second].turn^=1;
root=merge(merge(t1.first,t1.second),t2.second);
}
return 0;
}

小结:非旋转Treap就是比splay牛逼..

[bzoj1552\bzoj2506][Cqoi2014]robotic sort 排序机械臂_非旋转Treap的更多相关文章

  1. 【BZOJ-1552&3506】robotic sort&排序机械臂 Splay

    1552: [Cerc2007]robotic sort Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 806  Solved: 329[Submit][ ...

  2. BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap

    题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开 ...

  3. 洛谷 P4402 BZOJ1552 / 3506 [Cerc2007]robotic sort 机械排序

    FHQ_Treap 太神辣 蒟蒻初学FHQ_Treap,于是来到了这道略显板子的题目 因为Treap既满足BST的性质,又满足Heap的性质,所以,对于这道题目,我们可以将以往随机出的额外权值转化为每 ...

  4. 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)

    点此看题面 大致题意: 给你\(n\)个数.第一次找到最小值所在位置\(P_1\),翻转\([1,P_1]\),第二次找到剩余数中最小值所在位置\(P_2\),翻转\([2,P_2]\),以此类推.求 ...

  5. LibreOJ2241 - 「CQOI2014」排序机械臂

    Portal Description 给出一个\(n(n\leq10^5)\)个数的序列\(\{a_n\}\),对该序列进行\(n\)次操作.若在第\(i\)次操作前第\(i\)小的数在\(p_i\) ...

  6. P3165 [CQOI2014]排序机械臂

    题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到高度最低的物品的位置 P1P_1P1​ ,并把左起第一个物品至 P1P_1P1 ...

  7. 洛谷P3165 [CQOI2014]排序机械臂

    题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到摄低的物品的位置P1,并把左起第一个至P1间的物品反序:第二次找到第二低的物品 ...

  8. 【BZOJ1552】[Cerc2007]robotic sort Splay

    [BZOJ1552][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N ...

  9. 【BZOJ3506】排序机械臂(Splay)

    [BZOJ3506]排序机械臂(Splay) 题面 神TMBZOJ没有题面,感谢SYC的题面 洛谷的题面也不错 题解 对于每次旋转的物体 显然可以预处理出来 现在只要模拟旋转操作就行了 至于在哪里放标 ...

随机推荐

  1. 【CTSC 2007】 数据备份

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1150 [算法] 首先,有一个很显然的结论 : 如果要使距离和最小,必须选择相邻的办公 ...

  2. AMD 与 CMD 区别

    作者:玉伯链接:https://www.zhihu.com/question/20351507/answer/14859415来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  3. img标签间距问题

    关于img标签间距问题:多个img之间有间距,包含img标签的div之间有间距. <!doctype html> 2 <html lang="en"> 3 ...

  4. 1961 躲避大龙(dfs)

    1961 躲避大龙  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 你早上起来,慢悠悠地来到学校门口,发现已经是 ...

  5. codevs1358棋盘游戏(状压dp)

    1358 棋盘游戏  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 大师 Master     题目描述 Description 这个游戏在一个有10*10个格子的棋盘上进行,初 ...

  6. kafka与zookeeper实战笔记

    kafka命令 1.先启动zookeeper zkServer.cmd/zkServer.sh2.启动kafka[需要指定server.properties文件] kafka-server-start ...

  7. 在C#程序中,创建、写入、读取XML文件的方法

    一.在C#程序中,创建.写入.读取XML文件的方法 1.创建和读取XML文件的方法,Values为需要写入的值 private void WriteXML(string Values) { //保存的 ...

  8. 实例化vue发生了什么(详解vue生命周期)

    const app = new Vue({ el:"#app', data:{ message:'hello,lifePeriod' }, methods:{ init(){ console ...

  9. hibernate_08_关联映射_一对多

    hibernate的映射关系 一对多.多对一.一对一.多对多. 常用的是一对多和多对一. 在数据库中可以通过添加主外键的关联,表现一对多的关系:在hibernate中通过在一方持有多方的集合实现,即在 ...

  10. C# 彻底关闭程序,包括循环

    System.Environment.Exit(System.Environment.ExitCode); this.Dispose(); this.Close();