我突然发现了一件要命的事情
我发现昨天晚上的周赛 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;
}
