CQOI2014 排序機械臂

2021-08-21 06:08:18 字數 802 閱讀 5414

【題目鏈結】

洛谷 p3165

bzoj 3506

【解析】

如果用 splay 做,需要先排序,記錄每個點被選中的順序。

考慮到 fhq treap 的 heap 性質,直接將結點的 key 值設為每個物品的高度。充分利用小根堆的性質,使每次被選中的結點一定是根結點。

當資料單調時,操作總複雜度為 o(n)。

但當資料單調遞增時,暴力建樹的時間複雜度就會退化為 o(n ^ 2)。

這時可以用笛卡爾樹優化建樹。(這題資料水,用不著)

跑的比 splay 快多了。

【**】

#include

using

namespace

std;

const

int maxn = 1e5 + 10;

int n, a[maxn];

int size[maxn], lch[maxn], rch[maxn], rev[maxn], root;

#define up(o) (size[o] = size[lch[o]] + size[rch[o]] + 1)

inline

void down(int o)

inline

int merge(int x, int y)

else

}inline

int read()

int main()

for(int i = 1; i <= n; i++)

return

0;}

CQOI2014 排序機械臂

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

P3165 CQOI2014 排序機械臂

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

P3165 CQOI2014 排序機械臂

題目描述 為了把工廠中高低不等的物品按從低到高排好序,工程師發明了一種排序機械臂。它遵循乙個簡單的排序規則,第一次操作找到高度最低的物品的位置 p 1p 1 並把左起第乙個物品至 p 1p 1 間的物品 即區間 1,p 1 1,p 1 間的物品 反序 第二次找到第二低的物品的位置 p 2p 2 並把...