Submission #2284142


Source Code Expand

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

int n, m;
int q;

/// --- Union Find Library {{{ ///

struct UF {
  int n;
  vector<int> par, rank;
  UF(int n): n(n), par(n, -1), rank(n, 0) {}
  int find(int x) {
    return par[x] < 0 ? x : par[x] = find(par[x]);
  }
  int size(int x) {
    return -par[find(x)];
  }
  bool same(int a, int b) {
    return find(a) == find(b);
  }
  void unite(int a, int b) {
    a = find(a);
    b = find(b);
    if(a == b) return;
    if(rank[a] > rank[b]) swap(a, b);
    par[b] += par[a];
    par[a] = b;
    if(rank[a] == rank[b]) rank[b]++;
  }
};

/// }}}--- ///

using P = tuple<int, int, int>;
const int N = 4000;
vector<int> tree[N];
vector<pair<int, int>> treetwo[N];

int g[N][N];
int par[N][13];
int dist[N][13];
int dep[N];

void dfs(int i, int p = -1, int d = 0) {
  par[i][0] = p;
  dep[i] = d;
  if(p != -1) dist[i][0] = g[i][p];
  for(int j : tree[i]) if(j != p) {
    dfs(j, i, d + 1);
  }
}

void build() {
  dfs(0);
  for(int i = 1; i < 13; i++) {
    for(int j = 0; j < n; j++) {
      int p = par[j][i - 1];
      int d = dist[j][i - 1];
      if(p != -1) {
        par[j][i] = par[p][i - 1];
        dist[j][i] = max(d, dist[p][i - 1]);
      } else par[j][i] = -1;
    }
  }
}

int lca(int a, int b) {
  if(dep[a] > dep[b]) swap(a, b);
  // cerr << "dep ab = "<< dep[a] << " , " << dep[b] << endl;
  for(int i = 12; i >= 0; i--) {
    int p = par[b][i];
    if(p != -1 && dep[p] >= dep[a]) b = p;
  }
  if(a == b) return a;
  // cerr << "dep ab = "<< dep[a] << " , " << dep[b] << endl;
  // cerr << "ab = "<< a << " , " << b << endl;
  for(int i = 12; i >= 0; i--) {
    int pa = par[a][i];
    int pb = par[b][i];
    if(pa != pb) a = pa, b = pb;
  }
  return par[a][0];
}

int calc(int top, int a) {
  int res = 0;
  for(int i = 12; i >= 0; i--) {
    int p = par[a][i];
    if(p != -1 && dep[p] >= dep[top]) res = max(res, dist[a][i]), a = p;
  }
  return res;
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  cin >> n >> m;

  vector<P> es;
  for(int i = 0; i < m; i++) {
    int a, b, c; cin >> a >> b >> c;
    a--; b--;
    es.emplace_back(c, a, b);
  }
  sort(begin(es), end(es));

  UF treeone(n);
  ll cost = 0;

  // kruskal
  for(int i = 0; i < m; i++) {
    int a = get<1>(es[i]), b = get<2>(es[i]), c = get<0>(es[i]);
    if(!treeone.same(a, b)) {
      treeone.unite(a, b);
      tree[a].emplace_back(b);
      tree[b].emplace_back(a);
      treetwo[a].emplace_back(b, c);
      treetwo[b].emplace_back(a, c);
      g[a][b] = c;
      g[b][a] = c;
      cost += c;
    }
  }
  // doubling
  build();

  cin >> q;
  for(int i = 0; i < q; i++) {
    int s, t; cin >> s >> t;
    s--; t--;
    int l = lca(s, t);
    // cerr << "s = " << s + 1 << " , t = " << t + 1 << " , lca = " << l + 1 << endl;
    ll ans = cost;
    if(s == l) ans -= calc(s, t);
    else if(t == l) ans -= calc(t, s);
    else ans -= max(calc(l, s), calc(l, t));
    cout << ans << endl;
  }

}

Submission Info

Submission Time
Task A - Graph
User luma
Language C++14 (GCC 5.4.1)
Score 700
Code Size 3112 Byte
Status AC
Exec Time 344 ms
Memory 69100 KB

Judge Result

Set Name Sample subtask1 subtask2 All
Score / Max Score 0 / 0 200 / 200 300 / 300 200 / 200
Status
AC × 2
AC × 12
AC × 21
AC × 31
Set Name Test Cases
Sample sample_1.txt, sample_2.txt
subtask1 sample_2.txt, subtask_1_1.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_2.txt, subtask_1_3.txt, subtask_1_4.txt, subtask_1_5.txt, subtask_1_6.txt, subtask_1_7.txt, subtask_1_8.txt, subtask_1_9.txt
subtask2 sample_1.txt, sample_2.txt, subtask_1_1.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_2.txt, subtask_1_3.txt, subtask_1_4.txt, subtask_1_5.txt, subtask_1_6.txt, subtask_1_7.txt, subtask_1_8.txt, subtask_1_9.txt, subtask_2_1.txt, subtask_2_2.txt, subtask_2_3.txt, subtask_2_4.txt, subtask_2_5.txt, subtask_2_6.txt, subtask_2_7.txt, subtask_2_8.txt
All sample_1.txt, sample_2.txt, sample_1.txt, sample_2.txt, subtask_1_1.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_2.txt, subtask_1_3.txt, subtask_1_4.txt, subtask_1_5.txt, subtask_1_6.txt, subtask_1_7.txt, subtask_1_8.txt, subtask_1_9.txt, subtask_2_1.txt, subtask_2_2.txt, subtask_2_3.txt, subtask_2_4.txt, subtask_2_5.txt, subtask_2_6.txt, subtask_2_7.txt, subtask_2_8.txt, subtask_3_1.txt, subtask_3_2.txt, subtask_3_3.txt, subtask_3_4.txt, subtask_3_5.txt, subtask_3_6.txt, subtask_3_7.txt, subtask_3_8.txt
Case Name Status Exec Time Memory
sample_1.txt AC 1 ms 512 KB
sample_2.txt AC 1 ms 512 KB
subtask_1_1.txt AC 2 ms 896 KB
subtask_1_10.txt AC 81 ms 64880 KB
subtask_1_11.txt AC 1 ms 512 KB
subtask_1_2.txt AC 28 ms 62200 KB
subtask_1_3.txt AC 148 ms 67692 KB
subtask_1_4.txt AC 16 ms 61952 KB
subtask_1_5.txt AC 17 ms 61824 KB
subtask_1_6.txt AC 48 ms 62964 KB
subtask_1_7.txt AC 147 ms 66924 KB
subtask_1_8.txt AC 16 ms 61824 KB
subtask_1_9.txt AC 18 ms 62016 KB
subtask_2_1.txt AC 154 ms 66668 KB
subtask_2_2.txt AC 153 ms 66540 KB
subtask_2_3.txt AC 154 ms 67180 KB
subtask_2_4.txt AC 153 ms 66540 KB
subtask_2_5.txt AC 22 ms 61952 KB
subtask_2_6.txt AC 28 ms 62204 KB
subtask_2_7.txt AC 54 ms 63092 KB
subtask_2_8.txt AC 154 ms 67692 KB
subtask_3_1.txt AC 339 ms 67692 KB
subtask_3_2.txt AC 340 ms 67692 KB
subtask_3_3.txt AC 202 ms 63360 KB
subtask_3_4.txt AC 211 ms 63296 KB
subtask_3_5.txt AC 272 ms 66032 KB
subtask_3_6.txt AC 307 ms 67564 KB
subtask_3_7.txt AC 340 ms 67692 KB
subtask_3_8.txt AC 344 ms 69100 KB