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. 查看服务器wwn是否在交换机侧

    判断port_state是否为Online状态,是的话,读取出port_name,即为wwn. #!/usr/bin/env python3 # -*- coding: UTF-8 -*- impor ...

  2. 713C

    费用流 并没有想出来构图方法 我们设立源汇,其实我们关心的是相邻两个值的差值,如果差值小于0说明需要长高,那么向汇点连边差值,说明需要修改,如果差大于零,那么由源点连边差值,说明可以提供修改空间,再由 ...

  3. Python 35 进程间的通信(IPC机制)、生产者消费者模型

    一:进程间的通信(IPC):先进先出  管道:队列=管道+锁 from multiprocessing import Queue q=Queue(4) q.put(['first',],block=T ...

  4. Win10,JDK8,tomact7.0.85配置

    今天在win10上配置了jdk以及tomact先前使用jdk7+tomact7.0.56运行失败. 后经调整后正确配置注意事项如下: 1.下载并按照jdk-8u161-windows-x64,默认安装 ...

  5. [转载]cocos2d-触摸分发原理

    本文由泰然翻译组组长 TXX_糖炒小虾 原创,版权所有,转载请注明出处并通知作者和泰然! 原作 http://www.ityran.com/archives/1326/comment-page-1 触 ...

  6. 自己整理的HTML基本标签参考知识

          基 本 标 签 创建一个HTML文档 <html></html> 设置文档标题以及其他不在WEB网页上显示的信息 <head></head> ...

  7. Windows下错误码全解析

    windows系统下,调用函数出错时.可以调用GetLastError函数返回错误码.但是GetLastError函数返回值是DWORD类型,是一个整数.如果想要知道函数调用的真正错误原因,就需要对这 ...

  8. NetCore下获取项目文件路径

    我要获取的是doc/FPFile.xml 百度了一大堆就是找不到解决问题. 把属性更改为始终赋值, XmlDocument xdi = new XmlDocument(); xdi.Load((&qu ...

  9. ROS: Ubuntu16.04安装ROS-kinetic

    参考连接:SLAM: Ubuntu14.04_Kylin安装ROS-Indigo第一步: 软件源配置 1. 增加下载源(增加ubuntu版的ros数据仓库,即下载源)(通用指令适合任何版本的ros) ...

  10. DNN结构演进History—CNN( 优化,LeNet, AlexNet )

    本文相对于摘抄的文章已经有大量的修改,如有阅读不适,请移步原文. 以下摘抄转自于维基:基于深度学习的图像识别进展百度的若干实践 从没有感知域(receptive field) 的深度神经网络,到固定感 ...