為了把工廠中高低不等的物品按從低到高排好序,工程師發明了一種排序機械臂。它遵循乙個簡單的排序規則,第一次操作找到攝低的物品的位置p1,並把左起第乙個至p1間的物品反序;第二次找到第二低的物品的位置p2,並把左起第二個至p2間的物品反序...最終所有的物品都會被排好序。
上圖給出_個示例,第_次操作前,菝低的物品在位置4,於是把第1至4的物品反序;第二次操作前,第二低的物品在位罝6,於是把第2至6的物品反序...
你的任務便是編寫乙個程式,確定乙個操作序列,即每次操作前第i低的物品所在位置pi,以便機械臂工作。需要注意的是,如果有高度相同的物品,必須保證排序後它們的相對位置關係與初始時相同。
輸入格式:
第一行包含正整數n,表示需要排序的物品數星。
第二行包含n個空格分隔的整數ai,表示每個物品的高度。
輸出格式:
輸出一行包含n個空格分隔的整數pi。
輸入樣例#1: 複製
63 4 5 1 6 2
輸出樣例#1: 複製
4 6 4 5 6 6
神奇的splay
1 #include2 #include34using
namespace
std;56
const
int n = 500100;7
const
int inf =1e9;89
int data[n],siz[n],mn[n],pos[n],tag[n],ch[n][2
],fa[n],st[n];
10int
root,top;
1112
struct
datad[n];
1516 inline char
nc()
20 inline int
read()
28bool
cmp1(data a,data b)
32bool
cmp2(data a,data b)
35 inline void pushup(int
x) 42 inline void pushdown(int
x) 49
}50 inline int son(int
x) 53 inline void rotate(int
x) 60 inline void splay(int x,int
rt) 71}
72}73 inline int getkth(int
k) 83}84
}85 inline int getmnpos(int l,int
r) 91 inline void rever(int l,int
r) 96
int build(int l,int
r) */
102int mid = (l + r) >> 1
;103
int t = build(l,mid-1
);104 fa[t] = mid;ch[mid][0] =t;
105 t = build(mid+1
,r);
106 fa[t] = mid;ch[mid][1] =t;
107 data[mid] = d[mid].x; //
= mn[mid]pos[mid] = mid;
108pushup(mid);
109return
mid;
110}
111112
intmain()
128return0;
129 }
P3165 CQOI2014 排序機械臂
題目描述 為了把工廠中高低不等的物品按從低到高排好序,工程師發明了一種排序機械臂。它遵循乙個簡單的排序規則,第一次操作找到高度最低的物品的位置 p 1p 1 並把左起第乙個物品至 p 1p 1 間的物品 即區間 1,p 1 1,p 1 間的物品 反序 第二次找到第二低的物品的位置 p 2p 2 並把...
CQOI2014 排序機械臂
題目鏈結 洛谷 p3165 bzoj 3506 解析 如果用 splay 做,需要先排序,記錄每個點被選中的順序。考慮到 fhq treap 的 heap 性質,直接將結點的 key 值設為每個物品的高度。充分利用小根堆的性質,使每次被選中的結點一定是根結點。當資料單調時,操作總複雜度為 o n 但...
CQOI2014 排序機械臂
一道很水很水的題,splay樹儲存乙個最小值,每次查詢最小值所在的位置,旋轉到根,輸出它在第幾位。然後將它之前的節點打上翻轉標記,維護一下即可。注意這道題要先排序,因為翻轉操作之後就不知到它原來的位置了。1 never forget why you start 2 include3 include4...