关于MLE!!!!!!!!!!!!!!!!!!!!!!!!!!!
  • 板块学术版
  • 楼主IOIer
  • 当前回复6
  • 已保存回复7
  • 发布时间2024/8/22 21:17
  • 上次更新2024/8/23 08:36:40
查看原帖
关于MLE!!!!!!!!!!!!!!!!!!!!!!!!!!!
1035106
IOIer楼主2024/8/22 21:17

为什么下面这段代码会 MLE?

// author : yhy
#include <bits/stdc++.h>

using namespace std;
using LL = long long;
using Pii = pair<int, int>;

const int kMaxN = 5, kL = 21;

int n, m, mn[kMaxN], vis[kMaxN], ans[kMaxN];
vector<Pii> e[kMaxN];

struct Node {
  int id, x, y, w;
  bool operator<(Node _) { return w < _.w; }
} v[kMaxN];
struct Dsu {
  int fa[kMaxN];
  void Init() { iota(fa + 1, fa + n + 1, 1); }
  void M(int x, int y) { fa[x] = y; }
  int GetRoot(int x) {
    return fa[x] == x ? x : fa[x] = GetRoot(fa[x]);
  }
} s1, s2;
struct LCA {
  int d[kMaxN], f[kMaxN][kL], mx[kMaxN][kL];
  void Init(int x = 1, int fa = 0) {
    f[x][0] = fa, d[x] = d[fa] + 1;
    for (int i = 1; i < kL; i++) {
      f[x][i] = f[f[x][i - 1]][i - 1];
      mx[x][i] = max(mx[x][i - 1], mx[f[x][i - 1]][i - 1]);
    }
    for (auto [nxt, w] : e[x]) {
      nxt != fa && (mx[nxt][0] = w, Init(nxt, x), 0);
    }
  }
  Pii Lca(int x, int y, int ans = 0) { // {Lca, 值}
    d[x] > d[y] && (swap(x, y), 0);
    for (int i = 0; i < kL; i++) {
      ((d[y] - d[x]) >> i & 1) && (ans = max(ans, mx[y][i]), y = f[y][i]);
    }
    if (x == y) return {x, ans};
    for (int i = kL - 1; i >= 0; i--) {
      f[y][i] != f[x][i] && (ans = max(ans, max(mx[x][i], mx[y][i])), x = f[x][i], y = f[y][i]);
    }
    return {f[x][0], max(ans, max(mx[x][0], mx[y][0]))};
  }
} l;

signed main() {
  cin.tie(0)->ios::sync_with_stdio(0);
  cin >> n >> m, s1.Init();
  for (int i = 1; i <= m; i++) {
    cin >> v[i].x >> v[i].y >> v[i].w, v[i].id = i;
  }
  sort(v + 1, v + m + 1);
  for (int i = 1; i <= m; i++) {
    int fx = s1.GetRoot(v[i].x), fy = s2.GetRoot(v[i].y);
    if (fx != fy) {
      s1.M(fx, fy), vis[i] = 1;
      e[v[i].x].push_back({v[i].y, v[i].w});
      e[v[i].y].push_back({v[i].x, v[i].w});
    }
  }
  l.Init(), s2.Init();
  fill(mn + 1, mn + n + 1, 1e9);
  for (int i = 1; i <= m; i++) {
    if (!vis[i]) {
      int x = v[i].x, y = v[i].y;
      auto [lca, mx] = l.Lca(x, y); ans[v[i].id] = mx;
      for (; l.d[x] > l.d[lca]; x = s2.GetRoot(x)) {
        mn[x] = v[i].w, s2.M(x, s2.GetRoot(l.f[x][0]));
      }
      for (; l.d[y] > l.d[lca]; y = s2.GetRoot(y)) {
        mn[y] = v[i].w, s2.M(y, s2.GetRoot(l.f[y][0]));
      }
    }
  }
  for (int i = 1; i <= m; i++) {
    if (vis[i]) {
      ans[v[i].id] = mn[l.d[v[i].x] < l.d[v[i].y] ? v[i].y : v[i].x];
    }
  }
  for (int i = 1; i <= m; i++) {
    cout << ans[i] << '\n';
  }
}
2024/8/22 21:17
加载中...