比赛 |
2025.9.6 |
评测结果 |
AWWWTTTTTTTTTTTTT |
题目名称 |
Ski Slope |
最终得分 |
6 |
用户昵称 |
LikableP |
运行时间 |
39.523 s |
代码语言 |
C++ |
内存使用 |
6.75 MiB |
提交时间 |
2025-09-06 11:19:01 |
显示代码纯文本
#include <algorithm>
#include <cstdio>
const int MAXN = 1e5 + 10;
struct Graph {
struct EDGE {
int v, difficulty, enjoyment, next;
} edge[MAXN];
int head[MAXN], edgeNum;
void AddEdge(int u, int v, int difficulty, int enjoyment) {
edge[++edgeNum] = {v, difficulty, enjoyment, head[u]};
head[u] = edgeNum;
}
} G1, G2;
int maxDifficulty[MAXN], sumEnjoyment[MAXN];
void dfs(int now, int fa) {
sumEnjoyment[now] += sumEnjoyment[fa];
maxDifficulty[now] = ::std::max(maxDifficulty[now], maxDifficulty[fa]);
for (int i = G1.head[now]; i; i = G1.edge[i].next) {
int v = G1.edge[i].v, difficulty = G1.edge[i].difficulty, enjoyment = G1.edge[i].enjoyment;
if (v == fa) continue;
maxDifficulty[v] = difficulty, sumEnjoyment[v] = enjoyment;
dfs(v, now);
}
}
int N, M;
void Work1() {
while (M--) {
int s, courage, ans = 0;
scanf("%d %d", &s, &courage);
for (int i = 2; i <= N; ++i) {
int now = i, sum = 0, ok = true, ncourage = courage;
while (now != 1) {
Graph::EDGE e = G2.edge[G2.head[now]];
if (e.difficulty > s) {
ncourage--;
if (ncourage < 0) {
ok = false;
break;
}
}
sum += e.enjoyment;
now = e.v;
}
if (ok) {
ans = ::std::max(ans, sum);
}
}
printf("%d\n", ans);
}
}
void Work2() {
while (M--) {
int s, courage, ans = 0;
scanf("%d %d", &s, &courage);
for (int i = 2; i <= N; ++i) {
if (maxDifficulty[i] <= s) {
ans = ::std::max(ans, sumEnjoyment[i]);
}
}
printf("%d\n", ans);
}
}
int main() {
freopen("Ski.in", "r", stdin);
freopen("Ski.out", "w", stdout);
scanf("%d", &N);
for (int i = 2; i <= N; ++i) {
int p, d, e;
scanf("%d %d %d", &p, &d, &e);
G1.AddEdge(p, i, d, e);
G2.AddEdge(i, p, d, e);
}
dfs(1, 0);
scanf("%d", &M);
if (N <= 1000 && M <= 1000) {
Work1();
} else {
Work2();
}
return 0;
}