bzoj2071 POI2004 山洞迷宮

2022-08-22 21:54:16 字數 1588 閱讀 2990

傳送門:

題目大意:

在byteotia有乙個洞穴. 它包含n 個洞室和一些隧道連線他們. 每個洞室之間只有一條唯一的路徑連線他們. hansel 在其中乙個洞室藏了寶藏, 但是它不會說出它在哪. gretel 想知道. 當她詢問乙個洞室是否有寶藏時,如果她猜對了hansel 會告訴她,如果猜錯了他會告訴她哪個方向會有寶藏. 

給出洞穴的資訊,那麼無論hansel 把寶藏藏在了哪,求出最少要詢問多少次才能找到寶藏. 

思路:首先考慮一種貪心,每次選重心。

但是這顯然是錯的。。。

不過這給我們乙個提示,詢問次數不會超過log2(n)

然後通過轉換,這題就成了樹頂點標號,

證明既不顯然又不簡單

對樹頂點編號一題的解決可以參見:

s[x]表示x的子樹中哪些標號到x點的路徑上沒有比它大的標號,實際是乙個集合,程式中是乙個二進位制數

c[x]表示x的編號

f[x]表示在以i為根的子樹中最少需要0到f[x]的整數標號

然後對於葉子節點 

顯然f[i]=0,s[i]=

對於非葉子結點

如果有兩個子樹的s中都有同乙個標號c,那麼c[x]至少是c+1,因為兩個c的路徑之間必須有乙個比c大的標號,否則不合法。

而且c[x]不能再在任何乙個子樹的s集合中,也是這個原因,x到該點路徑上已經沒有未標號的點了。

於是

同時對於所有標號小於c[x]的結點將不會屬於s[x]

考慮s[x]怎麼求:

那麼f[x]就很顯然了,就是s[x]中的最大標號

#include#include#includeconst int maxn=50010,maxm=maxn<<1,init=(1<<18)-1,maxk=17;

using namespace std;

int pre[maxm],now[maxn],son[maxm],tot,n,f[maxn],s[maxn],c[maxn],ans=1e9,pw[maxk+3],cnt[maxk+3];

void add(int a,int b)

//s[x]表示x的子樹中哪些標號到x點的路徑上沒有比它大的標號

//c[x]表示x的編號

//f[x]表示在以i為根的子樹中最少需要0到f[x]的整數標號

void dfs(int x,int fa)

int res2=0,c0=0;s[x]=0;

memset(cnt,0,sizeof(cnt));

for (int y=now[x];y;y=pre[y]) if (son[y]!=fa)

for (int i=0;i

BZOJ 2935 Poi 1999 原始生物

time limit 3 sec memory limit 128 mb submit 145 solved 71 submit status discuss 原始生物的遺傳密碼是乙個自然數的序列k a1,an 原始生物的特徵是指在遺傳密碼中連續出現的數對 l,r 即存在自然數i使得l ai且r a...

BZOJ 1209 HNOI2004 最佳包裹

一眼掃過去,凸包?資料範圍什麼這麼小?10分鐘碼完了andrew,發現答案不對 臥槽怎麼是三維的。三維凸包不會啊tat 對著白書抄了一遍增量法,水過去了 你這樣真的好嗎 好吧回去再看一遍增量法,感覺很好玩的樣子。很想知道status裡0ms的大爺是怎麼做到的 隨機增量?include include...

bzoj1208 HNOI2004 寵物收養所

description 最近,阿q開了一間寵物收養所。收養所提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,阿q根據領養者的要求通過他自己發明的乙個特殊的公式,得出該領養者希望領養的寵物的特點值a a是乙個正整數,a 2 31 而他也給每個處在收養所...