公元2044
2044
2044
年,人類進入了宇宙紀元。
l 國有 n
nn個星球,還有 n−1
n-1n−
1 條雙向航道,每條航道建立在兩個星球之間,這$ n−1$ 條航道連通了 l 國的所有星球。
小 p 掌管一家物流公司, 該公司有很多個運輸計畫,每個運輸計畫形如:有一艘物流飛船需要從 u
iu_i
ui 號星球沿最快的宇航路徑飛行到 v
iv_i
vi 號星球去。顯然,飛船駛過一條航道是需要時間的,對於航道 j
jj,任意飛船駛過它所花費的時間為 t
jt_j
tj,並且任意兩艘飛船之間不會產生任何干擾。
為了鼓勵科技創新, l 國國王同意小 p 的物流公司參與 l 國的航道建設,即允許小 p 把某一條航道改造成蟲洞,飛船駛過蟲洞不消耗時間。
在蟲洞的建設完成前小 p 的物流公司就預接了 m
mm 個運輸計畫。在蟲洞建設完成後,這m
mm 個運輸計畫會同時開始,所有飛船一起出發。當這 m
mm 個運輸計畫都完成時,小 p 的物流公司的階段性工作就完成了。
如果小 p 可以自由選擇將哪一條航道改造成蟲洞, 試求出小 p 的物流公司完成階段性工作所需要的最短時間是多少?
1 ≤n
,m
≤300000
1\le n,m\le 300000
1≤n,m≤
3000
00 1≤a
i,bi
,≤
n1\le a_i,b_i,\le n
1≤ai,
bi,
≤n,0 ≤t
i≤
1000
0\le t_i\le1000
0≤ti≤
1000
,1 ≤u
i,vi
≤n
1\le u_i,v_i\le n
1≤ui,
vi≤
n 二分答案+lca+樹上差分
首先是樹上路徑問題,可以想到跟lca
\text
lca有關係
這裡建議使用樹鏈剖分求lca
\text
lca,倍增可能被卡
ps:講樹鏈剖分的乙個優秀部落格:樹鏈剖分
求完lca
\text
lca的時候可以順便統計路徑長度:dis
=dee
p[x]
+dee
p[y]
−2×d
eep[
lca]
dis=deep[x]+deep[y]-2\times deep[lca]
dis=de
ep[x
]+de
ep[y
]−2×
deep
[lca
] 看到最大值最小,容易想到二分答案
可以證明如果t1t1
t1的時間可以完成,那麼t2t2
t2也可以完成(t
2>t1
t2>t1
t2>t1
)因此答案具有單調性,可以二分答案
那麼現在就需要che
ck(m
id
)check(mid)
check(
mid)
列舉路徑長度比mid
midmi
d大的,用樹上差分,給路徑左右兩端+1,lca
lcalc
a-2(邊差分)
注意這裡我們先將邊權轉移為點權,那麼除了根節點每個點都有點權
然後如果找到乙個點使得最長邊減去這個點的點權(其實也是它與它父親之間那條邊的邊權)>=m
id
>=mid
>=m
id,且這些路徑的長度都比mid
midmi
d大,就說明mid
midmi
d可行否則如果找不到,就不可行
如果被卡了,可以採用dfs
dfsdf
s序優化
#include
#include
#include
#define n 300005
using
namespace std;
struct node
a[n<<1]
;struct ques
edge[n]
;int n,m,x,y,z,tot,cnt,l,r,f[n]
,deep[n]
,size[n]
,id[n]
,val[n]
,dis[n]
,son[n]
,top[n]
,cha[n]
;void
add(
int x,
int y,
int z)
void
dfs1
(int now,
int fa)
}void
dfs2
(int now,
int topf)
}int
lca(
int x,
int y)
return deep[x]
<=deep[y]
?x:y;
}//以上是樹剖基操
bool
check
(int mid)
for(
int i=n;i>=1;
--i)
return
false;}
inttwo_point
(int left,
int right)
return res;
}int
main()
dfs1(1
,0);
dfs2(1
,1);
for(
int i=
1;i<=m;
++i)
printf
("%d\n"
,two_point
(r-l,r+1)
);//二分答案
fclose
(stdin);
fclose
(stdout);
return0;
}
如果覺得我講的有點不清楚,可以去參考這位大佬的部落格
感謝閱讀qaq
NOIP2015提高組Day2 運輸計畫
其實題目說那麼多,一句話就是 給定一棵帶權樹與m mm條路徑,你可以使一條樹上的邊的權值變為0,問你m mm條路徑的長度的最大值最小是多少。這道題讓我想到了貨車運輸這道題,但是更難,但方法可以借鑑。因為這是最大值最小問題,很顯然可以二分答案。那這個二分判斷怎麼打呢?我們如果遇到某條邊,所有超時的邊 ...
Noip2015提高組總結
總體而言noip還行吧,每天前兩題都穩穩地,但是最後一題做得不好。day1,看完題目後,第一題簽到,第二題很直觀想出來了,又畫了個圖驗證了一下,tarjan雖然可能爆棧,但人工棧就沒問題了。第三題認為是dp一類的東西。畢竟是第一次提高組,還是挺緊張的,一二題打得特別仔細特別慢,對拍,肉眼查錯,搞了接...
NOIP2015提高組解析
題目見此 day1 神奇的幻方 裸裸的模擬 其實也可以發現規律 i 1在i的右上方,如果已經有數了,就填在i的下方 include includeusing namespace std int a 50 50 int nx,ny,n int main else elseelse a tx ty i ...