h國有\(n\)個城市,這\(n\)個城市用\(n-1\)條雙向道路相互連通構成一棵樹,\(1\)號城市是首都,也是樹中的根節點。
h國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境城市(葉子節點所表示的城市),決定動用軍隊在一些城市建立檢查點,使得從首都到邊境城市的每一條路徑上都至少有乙個檢查點,邊境城市也可以建立檢查點。但特別要注意的是,首都是不能建立檢查點的。
現在,在h國的一些城市中已經駐紮有軍隊,且乙個城市可以駐紮多個軍隊。一支軍隊可以在有道路連線的城市間移動,並在除首都以外的任意乙個城市建立檢查點,且只能在乙個城市建立檢查點。一支軍隊經過一條道路從乙個城市移動到另乙個城市所需要的時間等於道路的長度(單位:小時)。
請問最少需要多少個小時才能控制疫情。注意:不同的軍隊可以同時移動。
\(2≤m≤n≤50,000,0
二分答案t.
處理出t時每個軍隊能到達的最高的位置(約定離根越近越高).
如果乙個軍隊無法到達首都,則這個軍隊在最高的位置是最優的(能在盡量多葉子到根的路徑上).
如果乙個軍隊能到達首都(記為點集x),那麼它有兩種選擇:留在其到根路徑上與根相鄰的點u;到達另乙個與根相鄰的點.處理出其到根後還能走多久,以及唯一匹配的點u.
處理出還需覆蓋的與根相鄰的點(記為點集y).
將x,y按邊權排序,貪心即可.
#define k 17
#define n 50005
typedef long long ll;
struct graphe[n<<1];
struct resta1[n],a2[n];
ll len[n],w[n][k],l,r,mid;
int f[n][k],nxt[n],g[n],dep[n],p[n],n,m,t1,t2,cnt;
stacks,s1;
bool b[n],c[n];
bool operator < (rest x,rest y)
for(int i=g[u];i;i=e[i].nxt)
if(dep[e[i].to]>dep[u])
return c[u];
}inline bool chk(ll k)
x-=w[u][j];u=f[u][j];
if(!x) c[u]=true;
} }dfs2(1);
memset(b,0,sizeof(b));
for(int i=g[1];i;i=e[i].nxt)
if(!c[e[i].to])
a2[++t2].w=e[i].w,a2[t2].x=e[i].to,b[e[i].to]=true;
sort(a1+1,a1+1+t1);
sort(a2+1,a2+1+t2);
for(int i=1,j=1;i<=t1;++i)
while(j<=t2&&!b[a2[j].x]) ++j;
if(j>t2) return true;
if(a1[i].w>=a2[j].w) b[a2[j].x]=false;
} for(int i=1;i<=t2;++i)
if(b[a2[i].x]) return false;
return true;
}inline void aireen()
while(l>1;
if(chk(mid)) r=mid;
else l=mid+1ll;
} printf("%d\n",l);
}int main()
2017-10-27 13:47:52
vijos1909 noip2014 尋找道路
在有向圖 g 中,每條邊的長度均為 1,現給定起點和終點,請你在圖中找一條從起點到 終點的路徑,該路徑滿足以下條件 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。在滿足條件 1 的情況下使路徑最短。注意 圖 g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。第一行...
noip2010 飛彈攔截 vijos1810
經過11 年的韜光養晦,某國研發出了一種新的飛彈攔截系統,凡是與它的距離不超過其工作半徑的飛彈都能夠被它成功攔截。當工作半徑為0 時,則能夠攔截與它位置恰好相同的飛彈。但該飛彈攔截系統也存在這樣的缺陷 每套系統每天只能設定一次工作半徑。而當天的使用代價,就是所有系統工作半徑的平方和。某天,雷達捕捉到...
NOIP模擬20 題解
來自達哥的問候 究級難題,完全不可做qaq include include include using namespace std typedef long long ll int n ll a 25 b 25 c 25 d 25 ans void dfs int step,ll mdx,ll lh...