算 法:
樹鏈剖分
,最近公
共祖先,
差分,二
分答
案演算法:樹鏈剖分,最近公共祖先,差分,二分答案
演算法:樹鏈剖
分,最近
公共祖先
,差分,
二分答案
解題思路:
樹剖剖出每乙個點到根的距離用dis
[u
]dis[u]
dis[u]
表示u
uu到根距離。
找到每對點的lca,並算出距離,用d[i
]d[i]
d[i]
表示第i
ii組資料中兩點距離
二分答案mid
midmi
d作為最大邊長,找出有多少個d[i
]d[i]
d[i]
大於m id
midmi
d再從所有大於mid
midmi
d的邊中刪除一條邊,使得max
(d[i
])
max(d[i])
max(d[
i])減去這條邊後小於mid
midmi
d
/****************************************
* problem 運輸計畫
* time 2019.9.5
* user mzg1824_ty
* algrothim 樹鏈剖分 最近公共祖先 差分 二分
*****************************************/
#include
#define rep(i,a,b) for(register int (i)=(a);(i)<=(b);(i)++)
#define don(i,a,b) for(register int (i)=(a);(i)>=(b);(i)--)
using
namespace std;
const
int maxn=
3e5+10;
const
int maxm=
1e3+10;
int n,m,cnt;
int head[maxn]
,w[maxn]
;int f[maxn]
,size[maxn]
,id[maxn]
,son[maxn]
,top[maxn]
,wt[maxn]
,dep[maxn]
;int dis[maxn]
,lca[maxn]
,maxx,maxx1,a[maxn]
,b[maxn]
,d[maxn]
,topre[maxn]
;template
<
class
t>
inline
void
read
(t &x)
while
(isdigit
(ch)
) x*
=f;}
struct nodee[maxn<<1]
;void
add(
int u,
int v,
int w)
void
readdata()
}void
dfs1
(int u,
int fa,
int deep)}}
void
dfs2
(int u,
int topf)
}inline
intlca
(int x,
int y)
if(dep[x]
>dep[y]
)swap
(x,y)
;return x;
}bool
check
(int k)
}don
(i,n,1)
return
false;}
inline
intbinary_serch
(int l,
int r)
else l=mid+1;
}return ans;
}void
work()
printf
("%d\n"
,binary_serch
(maxx-maxx1,maxx+1)
);}int
main()
Luogu2680 NOIp2015 運輸計畫
傳送門 sol 最暴力的做法就是列舉最長鏈上的邊,然後再算一次所有的鏈長,更新 ans 這裡要求最大的最小,容易想到二分答案.對於二分的值 mid 掃一遍所有的鏈,若鏈長小於等於 mid 那麼是合法的不需要處理的.否則,就記錄鏈上所有的邊經過的次數 1 最後找到被經過次數等於鏈長大於 mid 的鏈數...
NOIP2015運輸計畫(洛谷2680)
標籤 樹鏈剖分,二分 題目背景 公元 2044 年,人類進入了宇宙紀元。題目描述 l 國有 n 個星球,還有 n 1 條雙向航道,每條航道建立在兩個星球之間,這 n 1 條航道連通了 l 國的所有星球。小 p 掌管一家物流公司,該公司有很多個運輸計畫,每個運輸計畫形如 有一艘物 流飛船需要從 ui ...
P2680 運輸計畫
好久沒更新部落格了,更一篇吧 qwq 傳送門要求我們讓路徑的最大時間最小 這很二分答案 可以二分答案 mid 然後想辦法 o n 去檢查答案是否合法 可以記錄出路徑長度大於 mid 的路徑,盡量在這些路徑的交集部分建造黑洞 顯而易見 我們可以用邊差分 diff i 來記錄這條邊被幾個大於 mid 的...