HDU 5493 Queue 二分 樹狀陣列

2021-09-12 07:32:56 字數 1811 閱讀 2931

題意:有n個人排隊,每個人都有乙個獨一無二的身高,告訴你每個人的身高和他前面或者後面的比他高的人的個數(到底是前是後是未知的)。 要求你還原原來的佇列,並且字典序最小。

思路:因為要求字典序最小, 我們可以先按照身高從小到大排序。乙個人前面有k個人比他高或者後面有k個人比他高,我們可以將這個問題轉化為求乙個min,使得有p個高的人在他前面。因為我們已經按照身高從小到大排過序了,所以對於乙個隊伍,我們由矮到高,逐個插入,所以空位就意味著是比當前人高的地方。那麼我們就可以利用樹狀陣列求在什麼位置的時候恰好有p個人在當前人(下標為i)的前面。(其中p=m

in(k

,n−i

−k

)p=min(k,n-i-k)

p=min(

k,n−

i−k)

)。ps:判斷在什麼位置是需要二分座位,不然後tle。

#include

#define eps 1e-8

#define inf 0x3f3f3f3f

#define pi acos(-1)

#define lson l,mid,rt<<1

#define rson mid+1,r,(rt<<1)+1

#define clr(x,y) memset((x),y,sizeof(x))

#define ****(x) cerr << #x << "=" << x << endl

using namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

int seed =

131;

const

int maxn =

1e5+5;

const

int mod =

1e9+7;

const

int mx =

1e5+5;

struct node

} e[maxn]

;int

lowbit

(int i)

int bit[maxn]

, n;

void

add(

int i,

int x)

}int

sum(

int i)

return num;

}int t;

int ans[maxn]

;int

main()

sort

(e +

1, e +

1+ n)

;for

(int i =

1; i <= n; i++

)int p =

min(e[i]

.k, n - i - e[i]

.k);

//當前位置前面需要幾個位置

p++;//判斷

int l = p;

int r = n;

int ans = n;

while

(l <= r)

else l = mid +1;

} ans[ans]

= e[i]

.h;add

(ans,1)

;}if(

!flag)

continue

;for

(int i =

1; i <= n; i++)}

return0;

}

hdu5493Queue 樹狀陣列 二分

在意個隊中 每個人知道它的身高和在排在他前面或者後面的 人的身高的個數 問能否恢復原來的佇列 如果有多種情況,輸出字典序最小的 先將人以身高從小到大排序 然後從第乙個人開始插入佇列 對於第i個人k即為在其前面或者後面需要留幾個位置在它前面或者後面 選擇兩種插入方式中位置小的乙個 可以用樹狀陣列記錄空...

HDU 5493 Queue(二分 樹狀陣列)

傳送門 題意 給你n個人,知道每個人的身高和每個人的前面或者後面有多少個比他高的,讓你輸出字典序最小的可能的排序。思路 我們可以將人按身高公升序順序,然後模擬插空,因為這樣我們就能保證之後插入的人有位置可插,只要注意每次我們可以判斷需要插入的空位置 min k,n i k i為第i個人,k為第i個人...

HDU 5493 Queue(二分 樹狀陣列)

題意 有n個人排隊,每個人都有乙個獨一無二的身高,告訴你每個人的身高和他前面或者後面的比他高的人的個數 到底是前是後是未知的 要求你還原原來的佇列,並且字典序最小。思路 因為要求字典序最小,我們可以先按照身高從小到大排序,假設當前到了第i高的人,他前面或者後面有k個人,那麼他前面的所有人都比他矮,比...