和JZOJ 4715构成双倍经验……
直接点分治的时候统计长度在$[S,E]$的最小的路径长度就行了……
然后题解十分奇怪……
统计的最点对个数应该是$[S,k]$吧……这个似乎必须是$O(n \log^2 n)$吧……而且再套上二分不就三个\log$了……
不太懂题解的做法……
1 %:pragma GCC optimize(2) 2 %:pragma GCC optimize(3) 3 %:pragma GCC optimize("Ofast") 4 %:pragma GCC optimize("inline") 5 %:pragma GCC optimize("-fgcse") 6 %:pragma GCC optimize("-fgcse-lm") 7 %:pragma GCC optimize("-fipa-sra") 8 %:pragma GCC optimize("-ftree-pre") 9 %:pragma GCC optimize("-ftree-vrp") 10 %:pragma GCC optimize("-fpeephole2") 11 %:pragma GCC optimize("-ffast-math") 12 %:pragma GCC optimize("-fsched-spec") 13 %:pragma GCC optimize("unroll-loops") 14 %:pragma GCC optimize("-falign-jumps") 15 %:pragma GCC optimize("-falign-loops") 16 %:pragma GCC optimize("-falign-labels") 17 %:pragma GCC optimize("-fdevirtualize") 18 %:pragma GCC optimize("-fcaller-saves") 19 %:pragma GCC optimize("-fcrossjumping") 20 %:pragma GCC optimize("-fthread-jumps") 21 %:pragma GCC optimize("-funroll-loops") 22 %:pragma GCC optimize("-fwhole-program") 23 %:pragma GCC optimize("-freorder-blocks") 24 %:pragma GCC optimize("-fschedule-insns") 25 %:pragma GCC optimize("inline-functions") 26 %:pragma GCC optimize("-ftree-tail-merge") 27 %:pragma GCC optimize("-fschedule-insns2") 28 %:pragma GCC optimize("-fstrict-aliasing") 29 %:pragma GCC optimize("-fstrict-overflow") 30 %:pragma GCC optimize("-falign-functions") 31 %:pragma GCC optimize("-fcse-skip-blocks") 32 %:pragma GCC optimize("-fcse-follow-jumps") 33 %:pragma GCC optimize("-fsched-interblock") 34 %:pragma GCC optimize("-fpartial-inlining") 35 %:pragma GCC optimize("no-stack-protector") 36 %:pragma GCC optimize("-freorder-functions") 37 %:pragma GCC optimize("-findirect-inlining") 38 %:pragma GCC optimize("-fhoist-adjacent-loads") 39 %:pragma GCC optimize("-frerun-cse-after-loop") 40 %:pragma GCC optimize("inline-small-functions") 41 %:pragma GCC optimize("-finline-small-functions") 42 %:pragma GCC optimize("-ftree-switch-conversion") 43 %:pragma GCC optimize("-foptimize-sibling-calls") 44 %:pragma GCC optimize("-fexpensive-optimizations") 45 %:pragma GCC optimize("-funsafe-loop-optimizations") 46 %:pragma GCC optimize("inline-functions-called-once") 47 %:pragma GCC optimize("-fdelete-null-pointer-checks") 48 49 #include <bits/stdc++.h> 50 using namespace std; 51 const int N = 1e5 + 10; 52 vector<pair<int, int> > g[N]; 53 int n, S, E, ans = 0x3f3f3f3f; 54 int sz[N], f[N] = { 0x3f3f3f3f }, root, ban[N], size; 55 56 void getrt(int u, int fa) { 57 sz[u] = 1, f[u] = 0; 58 for(auto e: g[u]) { 59 int v = e.first, w = e.second; 60 if(ban[v] || v == fa) continue; 61 getrt(v, u); 62 sz[u] += sz[v], f[u] = max(f[u], sz[v]); 63 } 64 f[u] = max(f[u], size - sz[u]); 65 if(f[u] < f[root]) root = u; 66 } 67 68 set<int> st; 69 70 void dfs(int u, int fa, int dep, int ty) { 71 if(ty == 0) { 72 if(S <= dep && dep <= E) ans = min(ans, dep); 73 int mn = S - dep; 74 if(st.size()) { 75 int mx = * -- st.end(); 76 if(dep + mx >= S) { 77 int y = dep + *st.lower_bound(S - dep); 78 if(S <= y && y <= E) ans = min(ans, y); 79 } 80 } 81 } else st.insert(dep); 82 for(auto e: g[u]) { 83 int v = e.first, w = e.second; 84 if(ban[v] || v == fa) continue; 85 dfs(v, u, dep + w, ty); 86 } 87 } 88 89 void sol(int u) { 90 ban[u] = 1; 91 st.clear(); 92 st.insert(0); 93 for(auto e: g[u]) { 94 int v = e.first, w = e.second; 95 if(ban[v]) continue; 96 dfs(v, u, w, 0); 97 dfs(v, u, w, 1); 98 } 99 for(auto e: g[u]) { 100 int v = e.first, w = e.second; 101 if(ban[v]) continue; 102 root = 0, size = sz[v]; 103 getrt(v, 0), sol(root); 104 } 105 } 106 107 int main() { 108 scanf("%d%d%d", &n, &S, &E); 109 for(int i = 1, u, v, w ; i < n ; ++ i) scanf("%d%d%d", &u, &v, &w), g[u].push_back( { v, w }), g[v].push_back( { u, w } ); 110 size = n, getrt(1, 0), sol(root); 111 if(S <= 0 && 0 <= E) ans = min(ans, 0); 112 printf("%d\n", ans == 0x3f3f3f3f ? -1 : ans); 113 }