我突然发现了一件要命的事情
我发现昨天晚上的周赛 F 题有一个很恐怖的现象!
有许多人都被卡成了 93.5,原因竟然各不相同。
数据到底有多水啊,后面的那几组数据。
上面都是废话。
然后,请大佬帮我调一下代码吧,悬赏一关注。谢谢了。
#include <bits/stdc++.h> #define L(i, a, b) for(int i = (a); i <= (b); i++) #define R(i, a, b) for(int i = (a); i >= (b); i--) #define ll long long using namespace std; const int N = 2e5 + 10; int a[N], dep[N], fa[N], sz[N], dfn[N], bfn[N], dfc, bfc, n, q, rk[N]; int h[N], tot; ll sum[N]; struct ST { ll lg[N], F[20][N]; void build() { L(i, 2, n) lg[i] = lg[i>>1] + 1; L(i, 1, lg[n]) L(j, 1, n) F[i][j] = max(F[i-1][j], F[i-1][j + (1 << i-1)]); } ll query(int l, int r) { int k = lg[r - l + 1]; return max(F[k][l], F[k][r - (1 << k) + 1]); } }st; struct Edge { int v, w, lst; }e[N<<2]; void add(int u, int v, int w) { e[++tot] = {v, w, h[u]}; h[u] = tot; } bitset<N> vis; vector<pair<int, int>> pos[N]; void bfs() { vis = 0; queue<int> q; q.push(1); while(!q.empty()) { int u = q.front(); q.pop(); bfn[u] = ++bfc; rk[bfc] = u; st.F[0][bfc] = sum[u]; pos[dep[u]].push_back({dfn[u], bfc}); // cout << dep[u] << '\n'; for(int i = h[u]; i;i = e[i].lst) { int v = e[i].v; if(v == fa[u]) continue; q.push(v); } } } void dfs(int u) { ++dfc; dfn[u] = dfc; sz[u] = 1; for(int i = h[u]; i; i = e[i].lst) { int v = e[i].v, w = e[i].w; if(v == fa[u]) continue; fa[v] = u; sum[v] = sum[u] + w; dep[v] = dep[u] + 1; dfs(v); sz[u] += sz[v]; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; L(i, 2, n) { int u, v, w; cin >> u >> v >> w; add(u, v, w); add(v, u, w); } dfs(1); bfs(); st.build(); // L(i, 1, n) cout << bfn[i] << ' '; cout << '\n'; // L(i, 1, n) cout << i << ' '; cout << '\n'; // L(i, 1, n) cout << dfn[i] << ' '; cout << '\n'; // L(i, 1, n) cout << st.F[0][i] << ' '; cout << '\n'; L(i, 0, n) sort(pos[i].begin(), pos[i].end()); cin >> q; L(i, 1, q) { int u, x; cin >> u >> x; int dp = dep[u] + x, L = dfn[u], R = dfn[u] + sz[u] - 1; auto l = lower_bound(pos[dp].begin(), pos[dp].end(), make_pair(L, 0)); auto r = upper_bound(pos[dp].begin(), pos[dp].end(), make_pair(R, 0)); if(r - pos[dp].begin() < 0) r = pos[dp].end()-1; if(l == pos[dp].end() || r->second - l->second + 1 <= 0) cout << -1 << '\n'; else cout << st.query((*l).second, (*r).second) - sum[u] << '\n'; } return 0; }
#include <bits/stdc++.h> #define L(i, a, b) for(int i = (a); i <= (b); i++) #define R(i, a, b) for(int i = (a); i >= (b); i--) #define ll long long using namespace std; const int N = 1e5 + 10; ll n, q, h[N], tot, dep[N], S[N], sz[N], fa[N], son[N], mx, sum[N]; struct Edge { ll v, w, lst; }e[N<<2]; void add(ll u, ll v, ll w) { e[++tot] = {v, w, h[u]}; h[u] = tot; } ll Ans[N]; vector<pair<ll, ll>> Q[N]; void dfs(int u) { sz[u] = 1; son[u] = -1; for(int i = h[u]; i; i = e[i].lst) { int v = e[i].v; if(v == fa[u]) continue; dep[v] = dep[u] + 1; sum[v] = sum[u] + e[i].w; fa[v] = u; dfs(v); sz[u] += sz[v]; if(son[u] == -1 || sz[v] > sz[son[u]]) son[u] = v; } } void init(int l, int r) { L(i, l, r) S[i] = 0; mx = 0; } void DFS(int u, ll dp, int p, int x) { S[dp] = max(S[dp], sum[u]); mx = max(mx, dp); for(int i = h[u]; i; i = e[i].lst) { int v = e[i].v; if(v == fa[u] || v == p) continue; DFS(v, dp+1, p, x); } } void dfs1(int u) { for(int i = h[u]; i; i = e[i].lst) { int v = e[i].v; if(v == fa[u] || v == son[u]) continue; dfs1(v); init(dep[v], mx); } if(son[u] != -1) dfs1(son[u]); DFS(u, dep[u], son[u], u); for(auto x : Q[u]) { int dp = x.first, id = x.second; if(mx < dp + dep[u]) Ans[id] = -1; else Ans[id] = S[dp + dep[u]] - S[u]; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; L(i, 2, n) { ll u, v, w; cin >> u >> v >> w; add(u, v, w); add(v, u, w); } cin >> q; L(i, 1, q) { int u, x; cin >> u >> x; Q[u].push_back({x, i}); } dep[1] = 1; dfs(1); dfs1(1); L(i, 1, q) cout << Ans[i] << '\n'; return 0; }