可以将高度定义为小数,这样就完美的解决了优先级的问题。
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. POJ - 3126 - Prime

    先上题目 Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9259   Accepted: 5274 D ...

  2. CGLib与JDK的动态代理

    一.CGLib 简单介绍 CGLib (Code Generation Library) 是一个强大的,高性能,高质量的Code生成类库. 它能够在执行期扩展Java类与实现Java接口. Hiber ...

  3. POJ 1379

    模拟退火算法. 随机MAX个点,然后,退火移动,选取距离所有点中最短中最长者即可.理解和我上一篇一样. #include <iostream> #include <cstdio> ...

  4. [Javascript] IntersectionObserver -- Lazy Load Images on a Website

    When it comes to websites performance is king. How long it takes for a page to load can mean the dif ...

  5. Android Studio左边栏Project不见了?

    非常多Android Stuio刚開始学习的人可能会一不小心把左边的Project栏给关了.结果发现找非常久也没找到怎么再打开Project栏. 如图.点击左下角button,Project就出来了.

  6. Struts简单介绍

    一.在介绍struts之前,先来了解一下什么是MVC框架吧. 1.MVC介绍 MVC全名是Model View Controller.是模型(model)-视图(view)-控制器(controlle ...

  7. bzoj2878 [Noi2012]迷失游乐园 [树形dp]

    Description 放假了,小Z认为呆在家里特别无聊.于是决定一个人去游乐园玩. 进入游乐园后.小Z看了看游乐园的地图,发现能够将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环 ...

  8. sikuli运行错误:Traceback (most recent call last):

    错误信息: Traceback (most recent call last): File "C:\Users\wb-cailu.a\AppData\Local\Temp\sikuli-tm ...

  9. 调试中的step into step over step out

    step into/step out/step over的差别 step into就是单步运行,遇到子函数就进入而且继续单步运行: step over是在单步运行时,在函数内遇到子函数时不会进入子函数 ...

  10. LeetCode96_Unique Binary Search Trees(求1到n这些节点能够组成多少种不同的二叉查找树) Java题解

    题目: Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For e ...