HDU 5493 Queue(二分 樹狀陣列)

2021-08-27 05:58:59 字數 1140 閱讀 3151

傳送門

題意:給你n個人,知道每個人的身高和每個人的前面或者後面有多少個比他高的,讓你輸出字典序最小的可能的排序。

思路:我們可以將人按身高公升序順序,然後模擬插空,因為這樣我們就能保證之後插入的人有位置可插,只要注意每次我們可以判斷需要插入的空位置=min(k,n-i-k)。(i為第i個人,k為第i個人有k個比他高的),如果小於0(代表n-i-k<0,空位置小於k個),則就是不可能的,然後只要二分去找位置,用樹狀陣列更新就行了。

附上**:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int inf = 0x3f3f3f3f;

typedef long long ll;

struct inst ;

inst ax[100010];

int bn[100010];

int gg[200020];

int n;

int cmp(inst a, inst b)

int change(int pos, int v)

return 0;

}int qusum(int x)

return ans;

}int main(void)

sort(ax + 1, ax + 1 + n, cmp);

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

int l = 1;

int r = n;

int mid;

int aaa = 0;;

k++;

while (l <= r)

else l = mid + 1;

}change(aaa, 1);

bn[aaa] = ax[i].num;

} printf("case #%d:", zzz++);

if (ok)

printf("\n");

} else printf(" impossible\n");

} return 0;

}

hdu5493Queue 樹狀陣列 二分

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

HDU 5493 Queue 二分 樹狀陣列

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

HDU 5493 Queue(二分 樹狀陣列)

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