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. kafka的topic和分区策略——log entry和消息id索引文件

    Topic在逻辑上可以被认为是一个在的queue,每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里. 为了使得Kafka的吞吐率可以水平扩展,物理上把topic分 ...

  2. nyoj--990--蚂蚁感冒(模拟)(思维题)

    蚂蚁感冒 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/ ...

  3. B1391 [Ceoi2008]order 最大权闭合图 最小割

    啊啊啊,假的题吧!!!我用的当前弧优化T了6个点,其他人不用优化AC!!!震惊!!!当前弧优化是假的吧!!! 到现在我也没调出来...大家帮我看看为啥70.... 来讲一下这个题的思路,就是设一个源点 ...

  4. aspectC++常用命令

    常用命令:1.ag++ main.cc //在工程目录下产生编译后的exe2.ag++ main.cc --weave_only //产生.acc 纯c++文件3.ag++ main.cc --gen ...

  5. myeclipse视图布局恢复

    使用Windows 菜单下的 Reset Perspective

  6. POJ 2186 Tarjan

    题意:有n(n<=10000)头牛,每头牛都想成为最受欢迎的牛,给出m(m<=50000)个关系,如(1,2)代表1欢迎2,关系可以传递,但是不是相互的,那么就是说1欢迎2不代表2欢迎1, ...

  7. C - Fafa and his Company

    Problem description Fafa owns a company that works on huge projects. There are n employees in Fafa's ...

  8. [转]SQLServe 存储表结构的几个系统表

    1. 获取表的基本字段属性 获取SqlServer中表结构 SELECT syscolumns.name,systypes.name,syscolumns.isnullable, syscolumns ...

  9. 在mac上截屏的几种方式

    方法 1: 对屏幕的一部分进行截图 按下Command+Shift+4   方法 2: 对整个屏幕进行截图 按下Command+Shift+3   方法 3: 把截图保存到粘贴板 按下Command+ ...

  10. javascript 核心概念(1)-数据类型

    语法 (1)到现在为止,大多数浏览器也还是支持到ECMAScript 第三版的标准. 核心概念就是一个语言的基本工作原理,涉及语法,操作符,数据类型. (2)javascript的一切--变量,函数名 ...