QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#660908#2804. Travel GuideAngelOlanWA 0ms3468kbC++202.4kb2024-10-20 13:54:382024-10-20 13:54:39

Judging History

This is the latest submission verdict.

  • [2024-10-20 13:54:39]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 3468kb
  • [2024-10-20 13:54:38]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;

constexpr int INF = 1e9;

struct STree {
  #define ls (k<<1)+1
  #define rs (k<<1)+2
  #define lp ls, s, m
  #define rp rs, m, e
  int n;
  vector<int> st;
  STree(int n) : n(n), st((n << 2) + 5, INF) {}
  int comb(int x, int y) { return min(x, y); }
  void upd(int k, int s, int e, int i, int x) {
    if (s + 1 == e) {
      st[k] = x;
      return;
    }
    int m = (s + e) >> 1;
    if (i < m) {
      upd(lp, i, x);
    } else {
      upd(rp, i, x);
    }
    st[k] = comb(st[ls], st[rs]);
  }
  void upd(int i, int x) { return upd(0, 0, n, i, x); }
  int query(int k, int s, int e, int a, int b) {
    if (s >= a && e <= b) {
      return st[k];
    }
    int m = (s + e) >> 1, ans = INF;
    if (a < m) {
      ans = comb(ans, query(lp, a, b));
    }
    if (b > m) {
      ans = comb(ans, query(rp, a, b));
    }
    return ans;
  }
  int query(int a, int b) { return query(0, 0, n, a, b); }
};

signed main() {
  cin.tie(0)->sync_with_stdio(0);

  int n, m;
  cin >> n >> m;
  vector<vector<pair<int, int>>> g(n);
  while (m--) {
    int u, v, w;
    cin >> u >> v >> w;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
  }

  vector<vector<int>> d(3, vector(n, INF));
  for (int i = 0; i < 3; ++i) {
    priority_queue<pair<int, int>> pq;
    pq.push({0, i});
    d[i][i] = 0;
    while (!pq.empty()) {
      auto [du, u] = pq.top();
      pq.pop();
      du = -du;
      if (du > d[i][u]) {
        continue;
      }
      for (auto &[v, w] : g[u]) {
        if (du + w < d[i][v]) {
          d[i][v] = du + w;
          pq.push({-d[i][v], v});
        }
      }
    }
  }

  vector<int> v;
  for (int i = 0; i < n; ++i) {
    v.push_back(d[0][i]);
    v.push_back(d[1][i]);
    v.push_back(d[2][i]);
    cout << d[0][i] << ' ' << d[1][i] << ' ' << d[2][i] << '\n';
  }

  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());

  auto get = [&](int x) -> int {
    return lower_bound(v.begin(), v.end(), x) - v.begin();
  };

  map<array<int, 3>, int> mp;
  for (int i = 0; i < n; ++i) {
    ++mp[{get(d[0][i]), get(d[1][i]), get(d[2][i])}];
  }

  STree st(v.size());
  int ans = 0;
  for (auto &[a, cnt] : mp) {
    auto [x, y, z] = a;
    if (z < st.query(0, y + 1)) {
      ans += cnt;
      st.upd(y, z);
    }
  }
  cout << ans << '\n';

  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3468kb

input:

5 4
0 3 1
1 3 1
2 3 1
4 3 1

output:

0 2 2
2 0 2
2 2 0
1 1 1
2 2 2
4

result:

wrong answer 1st lines differ - expected: '4', found: '0 2 2'