一道很水很水的題,splay樹儲存乙個最小值,每次查詢最小值所在的位置,旋轉到根,輸出它在第幾位。然後將它之前的節點打上翻轉標記,維護一下即可。
注意這道題要先排序,因為翻轉操作之後就不知到它原來的位置了。
1//never forget why you start
2 #include3 #include4 #include5 #include6 #include7 #include8
#define ll(x) bst[x].child[0]
9#define rr(x) bst[x].child[1]
10#define son(x,t) bst[x].child[t]
11#define inf (2147483647)
12using
namespace
std;
13int
root,n,cnt;
14struct
pointa[100005
];17
bool cmp1(const point a,const
point b)
20bool cmp2(const point a,const
point b)
23struct
bstbst[100005
];26
void push_up(int
root)
33void push_down(int
root)41}
42void rotate(int r,int
t)50
void splay(int r,int
goal)
59 fa=bst[r].fa;60}
61if(goal==0)root=r;62}
63int search(int
root)
69int find(int root,int
k)76
void build(int &root,int left,int right,int
fa)85
if(left1
,root);
86if(mid1
,right,root);
87 bst[root].x=a[mid].x;bst[root].size=1;88
push_up(root);89}
90int split(int l,int
r)97
void delet(int
pos)
108int
main()
131return0;
132 }
CQOI2014 排序機械臂
題目鏈結 洛谷 p3165 bzoj 3506 解析 如果用 splay 做,需要先排序,記錄每個點被選中的順序。考慮到 fhq treap 的 heap 性質,直接將結點的 key 值設為每個物品的高度。充分利用小根堆的性質,使每次被選中的結點一定是根結點。當資料單調時,操作總複雜度為 o n 但...
P3165 CQOI2014 排序機械臂
為了把工廠中高低不等的物品按從低到高排好序,工程師發明了一種排序機械臂。它遵循乙個簡單的排序規則,第一次操作找到攝低的物品的位置p1,並把左起第乙個至p1間的物品反序 第二次找到第二低的物品的位置p2,並把左起第二個至p2間的物品反序.最終所有的物品都會被排好序。上圖給出 個示例,第 次操作前,菝低...
P3165 CQOI2014 排序機械臂
題目描述 為了把工廠中高低不等的物品按從低到高排好序,工程師發明了一種排序機械臂。它遵循乙個簡單的排序規則,第一次操作找到高度最低的物品的位置 p 1p 1 並把左起第乙個物品至 p 1p 1 間的物品 即區間 1,p 1 1,p 1 間的物品 反序 第二次找到第二低的物品的位置 p 2p 2 並把...