P3165 CQOI2014 排序機械臂

2022-05-05 20:03:09 字數 2035 閱讀 9433

題目描述

為了把工廠中高低不等的物品按從低到高排好序,工程師發明了一種排序機械臂。它遵循乙個簡單的排序規則,第一次操作找到高度最低的物品的位置 p_1p

1​ ,並把左起第乙個物品至 p_1p

1​ 間的物品 (即區間 [1,p_1][1,p

1​ ] 間的物品) 反序;第二次找到第二低的物品的位置 p_2p

2​ ,並把左起第二個至 p_2p

2​ 間的物品 (即區間 [2,p_2][2,p

2​ ] 間的物品) 反序……最終所有的物品都會被排好序。

樣例說明

上圖給出有六個物品的示例,第一次操作前,高度最低的物品在位置 44 ,於是把第一至第四的物品反序;第二次操作前,第二低的物品在位罝六,於是把第二至六的物品反序……

你的任務便是編寫乙個程式,確定乙個操作序列,即每次操作前第 ii 低的物品所在位置 p_ip

i​ ,以便機械臂工作。需要注意的是,如果有高度相同的物品,必須保證排序後它們的相對位置關係與初始時相同。

輸入輸出格式

輸入格式:

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

第二行包含n個空格分隔的整數 p_ip

i​ ,表示每個物品的高度。

輸出格式:

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

\(splay\)的練手題。 剛開始想拿個treap查詢第\(k\)大的我就是個弱智。 我們先搞個結構體,存值的大小和值的位置,因為答案與原值無關,所以我們結構體排序一下就得到了第\(k\)次操作需要動的節點位置

因為剛開始時對於位置來說是有序的,所以我們有序的插入每個節點,因為有序列翻轉所以我們要加上哨兵節點(謝謝花)。我們在上一步已經處理好了第\(k\)步需要操作的點,\(splay\)到根,左子樹大小即為這個點左邊的點,同時也是這個點的\(rank\)(注意哨兵節點對結果的影響)。得到了\(rank\)就可以輸出了。現在有了左端點已經給出,又有了右端點(就是\(rank\)嘛),所以序列翻轉即可

值得注意的是,這次我們輸出前不包括\(find\),故不能\(pushdown\),所以我們需要在\(splay\)函式中手動加上\(pushdown\)。

void splay(int id, int goal)

if(!goal)root = id;

}

#include#include#include#include#include#includetypedef long long ll;

using namespace std;

int rd()

while(c >= '0' && c <= '9')

return flag * out;

}const int maxn = 100019,inf = 1e9;

int ch[maxn][2];

int val[maxn];

int size[maxn],pos[maxn];//pos用來表示某個值的位置

int lazy[maxn];

int fa[maxn];

int root, tot;

int new(int f, int v)

void pushup(int id)

void pushdown(int id)

}bool lor(int id)

void spin(int id)

void splay(int id, int goal)

if(!goal)root = id;

}int find(int id, int rank)

void insert(int v)

void reverse(int l, int r)

int num;

struct nodei[maxn];

bool cmp(node a, node b)

int main()

printf("%d\n", num);

return 0;

}

P3165 CQOI2014 排序機械臂

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

CQOI2014 排序機械臂

題目鏈結 洛谷 p3165 bzoj 3506 解析 如果用 splay 做,需要先排序,記錄每個點被選中的順序。考慮到 fhq treap 的 heap 性質,直接將結點的 key 值設為每個物品的高度。充分利用小根堆的性質,使每次被選中的結點一定是根結點。當資料單調時,操作總複雜度為 o n 但...

CQOI2014 排序機械臂

一道很水很水的題,splay樹儲存乙個最小值,每次查詢最小值所在的位置,旋轉到根,輸出它在第幾位。然後將它之前的節點打上翻轉標記,維護一下即可。注意這道題要先排序,因為翻轉操作之後就不知到它原來的位置了。1 never forget why you start 2 include3 include4...