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...