QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#524001#5102. Dungeon CrawlerAndycipationWA 1ms3632kbC++203.0kb2024-08-19 07:19:222024-08-19 07:19:22

Judging History

你现在查看的是最新测评结果

  • [2024-08-19 07:19:22]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3632kb
  • [2024-08-19 07:19:22]
  • 提交

answer

/*
 * author:  ADMathNoob
 * created: 08/18/24 10:47:30
 * problem: https://qoj.ac/problem/5102
 */

/*
Comments about problem:


*/

#include <bits/stdc++.h>

using namespace std;

#ifdef _DEBUG
#include "debug.h"
#else
#define debug(...) 42
#endif

const int N = 2005;
const int H = 13;

int n, q;
vector<pair<int, int>> g[N];

int pv[N];
int pre[N], post[N];
vector<int> order;
long long d[N];
long long maxD[N];

void Dfs(int v, int p) {
  pv[v] = p;
  pre[v] = order.size();
  order.push_back(v);
  maxD[v] = d[v];
  for (auto [u, w] : g[v]) {
    if (u == p) continue;
    d[u] = d[v] + w;
    Dfs(u, v);
    maxD[v] = max(maxD[v], maxD[u]);
  }
  post[v] = order.size() - 1;
}

int pr[N][H];
long long pref[N];
long long suf[N];

void DfsFrom(int v) {
  d[v] = 0;
  order.clear();
  Dfs(v, -1);
  for (int i = 0; i < n; i++) {
    fill(pr[i], pr[i] + H, -1);
  }
  for (int i = 0; i < n; i++) {
    pr[i][0] = pv[i];
  }
  for (int j = 1; j < H; j++) {
    for (int i = 0; i < n; i++) {
      pr[i][j] = (pr[i][j - 1] == -1 ? -1 : pr[pr[i][j - 1]][j - 1]);
    }
  }
  for (int i = 0; i < n; i++) {
    pref[i + 1] = max(pref[i], d[order[i]]);
  }
  for (int i = n - 1; i >= 0; i--) {
    suf[i] = max(suf[i + 1], d[order[i]]);
  }
}

long long MaxDist(int ex) {
  // farthest excluding subtree rooted at `ex`
  return max(pref[pre[ex]], suf[post[ex] + 1]);
}

bool Anc(int x, int y) {
  return pre[x] <= pre[y] && post[y] <= post[x];
}

int Lca(int x, int y) {
  if (Anc(x, y)) return x;
  if (Anc(y, x)) return y;
  for (int j = H - 1; j >= 0; j--) {
    if (pr[x][j] != -1 && !Anc(pr[x][j], y)) {
      x = pr[x][j];
    }
  }
  return pv[x];
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> q;
  long long total = 0;
  for (int i = 0; i < n - 1; i++) {
    int x, y, w;
    cin >> x >> y >> w;
    --x; --y;
    g[x].emplace_back(y, w);
    g[y].emplace_back(x, w);
    total += w;
  }
  vector<int> s(q), k(q), t(q);
  for (int i = 0; i < q; i++) {
    cin >> s[i] >> k[i] >> t[i];
    --s[i]; --k[i]; --t[i];
  }
  vector<vector<int>> phase1(n);
  for (int i = 0; i < q; i++) {
    phase1[k[i]].push_back(i);
  }
  const long long inf = 1e18;
  vector<long long> ret(q, inf);
  vector<vector<pair<int, int>>> phase2(n);
  for (int kk = 0; kk < n; kk++) {
    DfsFrom(kk);
    for (int qid : phase1[kk]) {
      int L = Lca(s[qid], t[qid]);
      if (L == t[qid]) continue;
      ret[qid] = 2 * total - MaxDist(L);
      int ex = (pv[L] != -1 ? pv[L] : -1);
      phase2[s[qid]].emplace_back(qid, ex);
    }
  }
  for (int ss = 0; ss < n; ss++) {
    DfsFrom(ss);
    for (auto [qid, ex] : phase2[ss]) {
      long long res;
      if (ex == -1) {
        res = maxD[ss];
      } else {
        res = MaxDist(ex);
      }
      ret[qid] = min(ret[qid], 2 * total - res);
    }
  }
  for (long long r : ret) {
    if (r == inf) {
      cout << "impossible\n";
    } else {
      cout << r << '\n';
    }
  }
  return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 3632kb

input:

22 5
1 2 7
2 3 5
3 4 8
3 6 6
3 7 3
2 5 6
5 8 2
8 9 11
2 10 16
1 11 12
11 12 4
11 13 9
1 14 25
14 15 4
15 16 5
15 17 6
15 18 1
15 19 8
14 20 7
20 21 9
20 22 17
1 19 9
1 9 19
1 8 9
1 9 8
2 22 11

output:

306
293
293
impossible
306

result:

wrong answer 1st lines differ - expected: '316', found: '306'