hdu5493Queue 樹狀陣列 二分

2021-07-05 12:07:23 字數 1101 閱讀 5811

//在意個隊中

//每個人知道它的身高和在排在他前面或者後面的

//人的身高的個數

//問能否恢復原來的佇列

//如果有多種情況,輸出字典序最小的

//先將人以身高從小到大排序

//然後從第乙個人開始插入佇列

//對於第i個人k即為在其前面或者後面需要留幾個位置在它前面或者後面

//選擇兩種插入方式中位置小的乙個

//可以用樹狀陣列記錄空位 , 用二分找位置

#include

#include

#include

#include

using

namespace

std ;

const

int maxn = 1e5+10 ;

int tree[maxn] ;

struct node

}a[maxn];

bool cmp(struct node a , struct node b)

int ans[maxn] ;

void update(int x , int dx)

}int getsum(int x)

return sum ;

}int find(int l , int r , int v)

return l ;

}int main()

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

tree[i] = 0 ;

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

bool flag = false;

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

else

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

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

if(flag)

puts("impossible");

else

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

printf("%d%c" , a[i].h , i == n ?'\n':' ') ;

}return

0 ;}

HDU 5493 Queue(二分 樹狀陣列)

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

HDU 5493 Queue 二分 樹狀陣列

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

HDU 5493 Queue(二分 樹狀陣列)

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