JZOJ3599 CQOI2014 排序機械臂

2021-08-14 17:46:01 字數 1159 閱讀 1762

splay裸題不解釋。。。

按照位置為關鍵字排序,維護子樹大小和區間最小。

之後每找到乙個最小的值,就把它區間旋到邊上,然後放到最頂上扔掉

寫得相對比較優美

code:

#include 

#include

#include

#define fo(a,b,c) for (a=b; a<=c; a++)

#define fd(a,b,c) for (a=b; a>=c; a--)

#define min(x,y) (xusing

namespace

std;

int n,i,j,k,l;

int a[100002];

int b[100002];

int c[100002];

int ch[100002][2];

int f[100002];

int s[100002];

int m[100002];

bool rev[100002];

void qsort(int l,int r)

}if (lif (ireturn ;

}void update(int t)

void downtag(int t)

}void maketree(int t,int l,int r)

f[mid]=t;

if (!ch[t][0])

ch[t][0]=mid;

else

ch[t][1]=mid;

update(mid);

}void rot(int t)

void splay(int t,int x)

}}void find(int t,int sum,bool bz)

if (m[ch[t][0]]1]])

find(ch[t][0],sum,bz);

else

find(ch[t][1],sum+s[ch[t][0]]+1,bz);

}int main()

else

rev[k]=1;

splay(k,0);

j=k;

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

return

0;}

CQOI2014 排序機械臂

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

CQOI2014 排序機械臂

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

BZOJ3506 Cqoi2014 排序機械臂

bzoj3506 cqoi2014 排序機械臂 額,bzoj 上沒有題面。本蒟蒻表示沒錢氪金。這裡附上洛谷的題面 洛谷p3165 cqoi2014 排序機械臂 為了把工廠中高低不等的物品按從低到高排好序,工程師發明了一種排序機械臂。它遵循乙個簡單的排序規則,第一次操作找到高度最低的物品的位置 p 1...