樹狀陣列 二分 HDU5493

2021-10-06 23:51:06 字數 1207 閱讀 3912

題解:

因為有限制的是比當前人更高的人才有限制。所以如果之前安排的人都比這個人的身高低的話那麼不會造成任何貢獻。所以相當於按照空位插空,如果需要安排的人數大於空位數顯然是無解的。空位數用樹狀陣列存,因為位置越向右前面被佔的位置越多,留下的空位越少,所以具有二分性。

那麼就有兩種情況,一種是插左邊,那麼空位數就需要num+1個,如果之前的人和比他高的人都插右邊的話就需要n-i-num+1個。取min就滿足字典序最小了。

#include

//#define int long long

using

namespace std;

const

int n=

1e5+10;

int n;

#define lowbit(x) x&(-x)

struct nodenode[n]

;int

cmp(node a,node b)

int tr[n]

;void

add(

int x)

}int

ask(

int x)

return sum;

}int

work

(int x)

return l;

}int

cmp2

(node a,node b)

void

init()

signed

main()

int x1=

work

(node[i]

.num+1)

;int x2=

work

(n-node[i]

.num-i+1)

; node[i]

.postion=

min(x1,x2)

;add

(node[i]

.postion);}

if(flag)

sort

(node+

1,node+

1+n,cmp2)

;for

(int i=

1;i<=n;i++

)printf

("%d%c"

,node[i]

.h,i==n?

'\n'

:' ');

}}

hdu5493Queue 樹狀陣列 二分

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

HDU 5493 Queue(二分 樹狀陣列)

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

HDU 5493 Queue 二分 樹狀陣列

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