【題目鏈結】
洛谷 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 並把...