P3165 CQOI2014 排序機械臂

2022-04-06 17:38:03 字數 1800 閱讀 5627

為了把工廠中高低不等的物品按從低到高排好序,工程師發明了一種排序機械臂。它遵循乙個簡單的排序規則,第一次操作找到攝低的物品的位置p1,並把左起第乙個至p1間的物品反序;第二次找到第二低的物品的位置p2,並把左起第二個至p2間的物品反序...最終所有的物品都會被排好序。

上圖給出_個示例,第_次操作前,菝低的物品在位置4,於是把第1至4的物品反序;第二次操作前,第二低的物品在位罝6,於是把第2至6的物品反序...

你的任務便是編寫乙個程式,確定乙個操作序列,即每次操作前第i低的物品所在位置pi,以便機械臂工作。需要注意的是,如果有高度相同的物品,必須保證排序後它們的相對位置關係與初始時相同。

輸入格式:

第一行包含正整數n,表示需要排序的物品數星。

第二行包含n個空格分隔的整數ai,表示每個物品的高度。

輸出格式:

輸出一行包含n個空格分隔的整數pi。

輸入樣例#1: 複製

6

3 4 5 1 6 2

輸出樣例#1: 複製

4 6 4 5 6 6

神奇的splay

1 #include2 #include3

4using

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...