HDU 5493 Queue(二分 樹狀陣列)

2021-12-29 22:18:12 字數 1136 閱讀 2154

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

思路: 因為要求字典序最小, 我們可以先按照身高從小到大排序,假設當前到了第i高的人, 他前面或者後面有k個人, 那麼他前面的所有人都比他矮, 比他高的還有n-i個人,那麼假設他前面還有p個空位, 他就是第p+1個空位上的人, 那麼怎麼求p呢? 因為要求字典序最小, 所以 p = min(k, n - i - k)。 為什麼這樣是對的呢?每個人有兩個可能位置啊, 因為他之前的都比他矮, 所以他無論在哪個位置都是可以的。 那麼為了讓字典序最小, 就選擇乙個較小的位置。 當n - i - k < 0 時, 說明沒有多餘空格, 那麼無解。

為了加速演算法, 二分第i個人的位置, 用樹狀陣列判斷他前面有多少人以此確定空餘的位置數。

複雜度o(n*logn*logn)。

細節參見**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a) 0)

return ans;

}void add(int x, int d)

}int main()

sort(a+1,a+n+1);

bool ok = true;

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

++k;

while(r > l)

add(l, 1);

ans[l] = a[i].v;

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

if(ok)

printf("\n");

}else printf(" impossible\n");

}return 0;

}

hdu5493Queue 樹狀陣列 二分

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

HDU 5493 Queue(二分 樹狀陣列)

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

HDU 5493 Queue 二分 樹狀陣列

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