比赛 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;
}