树的直径+单调队列
这竟然和bzoj1999是一样的?
我们yy一下,发现这条路径肯定在树的直径上,然后就好办了,我们维护一个双指针,保证长度<=s,然后最大距离就是直径的两端到路径的两端的最大值,还有当前路径上挂着的链,这个我们dfs一下就行了,然后直径两端的最大值直接求就行了,链的最大值维护一个单调队列,那么就可以O(n)出解了,求直径用两次bfs
bzoj1999卡到rank1了!
bzoj2282rank2!
#include<bits/stdc++.h> using namespace std; const int N = 500010; struct edge { int nxt, to, w; } e[N << 1]; int n, cnt = 1, S, ans = 0x3f3f3f3f; int d[N], route[N], head[N], vis[N], dis[N], dep[N], q[N], last[N]; namespace IO { const int Maxlen = N * 50; char buf[Maxlen], *C = buf; int Len; inline void read_in() { Len = fread(C, 1, Maxlen, stdin); buf[Len] = '