可以将高度定义为小数,这样就完美的解决了优先级的问题。
Code:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=100000+2;
int cnt[10000000+33];
double B[maxn],A[maxn];
struct Node
{
int s,tag;
double v,minv;
Node *ch[2];
int ls(){
if(ch[0]==NULL)return 0;
return ch[0]->s;
}
Node(double u)
{
v=u,s=1,minv=u,tag=0;
ch[0]=ch[1]=NULL;
}
int cmp(double x){
if(ch[0]!=NULL)
{if(ch[0]->minv==x)return 0;}
if(ch[1]!=NULL)
{if(ch[1]->minv==x)return 1;}
return -1;
}
int cmp2(int k){
int lsize=ch[0]==NULL?0:ch[0]->s;
if(k<=lsize)return 0;
if(k==lsize+1)return -1;
return 1;
}
void down(){
if(tag==1){
tag=0;
swap(ch[0],ch[1]);
if(ch[0]!=NULL)ch[0]->tag=!ch[0]->tag;
if(ch[1]!=NULL)ch[1]->tag=!ch[1]->tag;
}
}
void maintain(){
s=1,minv=v;
if(ch[0]!=NULL){
s+=ch[0]->s;minv=min(minv,ch[0]->minv);
}
if(ch[1]!=NULL){
s+=ch[1]->s;minv=min(minv,ch[1]->minv);
}
}
};
void rotate(Node* &o,int d){
Node *k=o->ch[d^1];o->ch[d^1]=k->ch[d];k->ch[d]=o;
o->maintain();k->maintain();o=k;
}
void splay(Node* &o,double x){
o->down();
int d=o->cmp(x);
if(d!=-1){
Node *p=o->ch[d];
p->down();
int d2=p->cmp(x);
if(d2!=-1){
splay(p->ch[d2],x);
if(d==d2)
rotate(o,d^1);
else
{ rotate(p,d2^1);o->ch[d]=p;}
}
rotate(o,d^1);
}
}
void splay2(Node* &o,int k){
o->down();
int d=o->cmp2(k);
if(d==1)k-=o->ls()+1;
if(d!=-1)
{
Node *p=o->ch[d];
p->down();
int d2=p->cmp2(k);
if(d2==1)k-=p->ls()+1;
if(d2!=-1){
splay2(p->ch[d2],k);
if(d==d2)
rotate(o,d^1);
else
rotate(o->ch[d],d2^1);
}
rotate(o,d^1);
}
}
void build(double arr[],int l,int r,Node* &o){
if(l>r)return;
int mid=(l+r)/2;
o=new Node(arr[mid]);
build(arr,l,mid-1,o->ch[0]);
build(arr,mid+1,r,o->ch[1]);
o->maintain();
}
void remove(Node* &o){
if(o->ch[0]==NULL)o=o->ch[1];
else if(o->ch[1]==NULL)o=o->ch[0];
else
{
Node *right=o->ch[1];
splay2(o->ch[0],o->ch[0]->s);
Node *left=o->ch[0];
left->ch[1]=right;
left->maintain();
o=left;
}
}
Node *head;
int main()
{
int N;
scanf("%d",&N);
for(int i=1;i<=N;++i){
int a;
scanf("%d",&a);
++cnt[a];
B[i]=a+(0.000001)*(cnt[a]);
A[i]=B[i];
}
sort(B+1,B+1+N);
build(A,1,N,head);
for(int i=1;i<=N-1;++i)
{
splay(head,B[i]);
if(head->ch[0]!=NULL)head->ch[0]->tag=!head->ch[0]->tag;
printf("%d ",head->ls()+i);
remove(head);
}
printf("%d\n",N);
return 0;
}

  

 

洛谷P3165 [CQOI2014]排序机械臂 Splay维护区间最小值的更多相关文章

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

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

  2. [UVA1402]Robotic Sort;[SP2059]CERC07S - Robotic Sort([洛谷P3165][CQOI2014]排序机械臂;[洛谷P4402][Cerc2007]robotic sort 机械排序)

    题目大意:一串数字,使用如下方式排序: 先找到最小的数的位置$P_1$,将区间$[1,P_1]$反转,再找到第二小的数的位置$P_2$,将区间$[2,P_2]$反转,知道排序完成.输出每次操作的$P_ ...

  3. P3165 [CQOI2014]排序机械臂

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

  4. Luogu P3165 [CQOI2014]排序机械臂

    先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...

  5. [BZOJ3506] [Cqoi2014] 排序机械臂 (splay)

    Description 同OJ1552 Input Output Sample Input Sample Output HINT Source Solution Q:哎不是同一道题吗为什么分两篇博客来 ...

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

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

  7. 1552/3506. [CQOI2014]排序机械臂【平衡树-splay】

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

  8. bzoj3506 [Cqoi2014]排序机械臂

    bzoj3506 此题是一道比较简单的spaly题目. 用splay维护序列,将每个点排到对应的位置之后删除,这样比较容易区间翻转. 我的指针写法在洛谷上AC了,但在bzoj上RE. #include ...

  9. BZOJ3506/1502 [CQOI2014]排序机械臂

    传送门 依然是一道splay的区间操作,需要注意的是要把下标离散化后来表示splay的节点,我不知道怎么搞所以索性弄了个$ValuetoNode$,看样子没什么问题, 感觉他那个传下标的方法太暴力了. ...

随机推荐

  1. 【习题 4-9 UVA - 815】Flooded!

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 题目很迷啊. 不会出现盆地? 可以理解为一条线. 从左往右高度上升的一座座山. 然后V升的水从最左边的山倒进去. 然后问你最后海拔多 ...

  2. Java循环遍历中直接修改遍历对象

    Java 循环遍历中直接修改遍历对象如下,会报异常: for (ShopBaseInfo sp: sourceList) { if(sp.getId()==5){ sourceList.remove( ...

  3. 反射常用API

    反射所有功能都是通过class API来实现的 class常用API有: 1.class.GETINTERFACES():获得这个类实现的接口. 2.class.getMethods() Method ...

  4. android 软键盘的显示与隐藏问题的研究

    在android中,常常会和输入法的软件键盘交互.在Manifest文件中,系统给activity的一个属性-windowSoftInputMode来控制输入法的显示方式. 该属性提供了Activit ...

  5. SecureCRTPortal保存的密码位置

    SecureCRTPortal保存的密码位置 Options> Global Options > Configuration Folder 一般为:C:\Users\Administrat ...

  6. UVa 10297 - Beavergnaw

    题目:假设一个底边与高为D的圆柱切去一部分使得.剩下的中心是底边与高为d的圆柱. 和以他们底面为上下地面的圆锥台,已知切去的体积,求d. 分析:二分,计算几何.圆锥台体积公式:π*(r^2+r*R+R ...

  7. WAS_集群部署应用遭遇ADMA0085E和ADMA0109W错误

    原创作品,出自 "深蓝的blog" 博客.深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/47143431 近日 ...

  8. android 构建GPS Provide步骤及信息

    构建GPS Provide步骤及信息 1.   用GPS2GoogleEarth录制KML文件 2.   KML文件 2.1 经纬度解析 <LineString> <coordina ...

  9. hdoj-1004-Let the Balloon Rise(水题)

    Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  10. [jqpolt] formatString 日期格式化列表

    // 年 %Y   2008 %y   08 // 月 %m   09 %#m   9 %B   September %b   Sep // 日 %d   05 %#d   5 %e   5 %A   ...