BTP職業網球賽(二分 並查集)

2021-07-09 17:44:15 字數 1285 閱讀 2154

ac通道:

參加職業網球賽的奶牛們有著職業牛網球賽協會(btp)的排名。

有時候,**一場網球賽的結果是可能的。

如果參賽的兩頭牛排名之間的差距大於乙個給定的常數k(0<=k<=n-1),即|rank1-rank2|>k(其中rank1,rank2分別表示奶牛1與奶牛2的排名),那麼排名較高的奶牛總是會贏得比賽的勝利。

下週將有乙個大型的淘汰賽制的賽事,有n(n=2^t,t<=16,t∈n)頭奶牛參賽,產生乙個冠軍。在第一輪,n/2對選手進行比賽,獲勝的n/2個選手進入下一輪。

同樣,下面的每輪比賽中,都是獲勝的一半進入下一輪,直到只剩一頭牛。

場外的牛們在對比賽下賭注,想知道隨著一輪一輪的比賽,最後有可能奪冠的牛中排名最低的牛的排名。

你的工作就是計算這個最低排名,並且給出一種能使這頭牛獲勝的場次安排。

第1行:兩個空格隔開的數n和k。

一行乙個整數,即所有可能奪冠的牛中排名最低的牛的排名。

16 3

本題首先可以想到二分答案。這種求極值的問題一般都可以通過二分答案轉化為判定性的問題。

在判定是否可以實現的時候,我們可以想到一種貪心的方法,進行倒退,對於當前輪未被刷下去的奶牛,找到乙個被刷下去的,標號最小的它能夠戰勝的奶牛。如何找到這個奶牛呢?一開始,我直接用的迴圈,結果超時了(>﹏<),接著,我突然想到了並查集中,可以用find(i)表示從i開始未被刷的奶牛。

接著就可以愉快的ac了。

#include 

#include

#include

using

namespace

std;

int t,k,n,l=1,r,ans=0,tot;

int fa[100000];

bool in[100000];

int num[100000];

inline

int max(int x,int y)

inline

int min(int x,int y)

return tmp;

}bool pan(int x)

}cnts=rcnts;

}return

true;

}int main()

while(l<=r)

else

}tot++;

printf("%d\n",ans);

return

0;

}

關押罪犯 並查集 二分

s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...

擴散(二分答案 並查集)

乙個點每過乙個單位時間就會向四個方向擴散乙個距離,兩個點a b連通,記作e a,b 當且僅當a b的擴散區域有公共部分。連通塊的定義是塊內的任意兩個點u v都必定存在路徑e u,a0 e a0,a1 e ak,v 給定平面上的n給點,問最早什麼時刻它們形成乙個連通塊。我們可以二分答案,然後對於每個時...

poj3657 二分 並查集

二分哪一次操作是最後一次正確的操作 1即為錯誤操作。把最小值相同的詢問確定下來,可以得到乙個最小的集合,再更新這個集合的所屬,若有衝突就說明此操作有問題。include include include define maxd 1000010 define maxq 25010 using names...