提出 #25037741


ソースコード 拡げる

#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>

#define ld long double
#define ull unsigned long long
#define ll long long
#define pb push_back
#define ppb pop_back
#define eb emplace_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define fast_io cout.tie(0), cin.tie(0), ios_base::sync_with_stdio(0)

//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("O3")

using namespace std;
//using namespace __gnu_pbds;
//typedef tree<ll, null_type, less_equal<>, rb_tree_tag,
//    tree_order_statistics_node_update> ordered_set;

ld eps = (ld) 1 / 1e6;
ll inf_ll = 1e18 + 100, mod1 = 1e9 + 7, mod2 = 998244353;
ll mersen_mod = 2305843009213693951;

ll sqr(ll a) { return a * a; }
ll qb(ll a) { return a * a * a; }
ll gcd(ll a, ll b) { return !a ? b : gcd(b % a, a); }
ll add(ll a, ll b, ll mod) {
  a += b;
  if (a >= mod) a -= mod;
  return a;
}
ll sub(ll a, ll b, ll mod) {
  a -= b;
  if (a < 0) a += mod;
  return a;
}
ll binpow(ll a, ll b, ll mod) {
  return b ? (b % 2 ? (a * (sqr(binpow(a, b / 2, mod)) % mod)) % mod :
              sqr(binpow(a, b / 2, mod)) % mod) : 1;
}
ll binmult(ll a, ll b, ll mod) {
  return b ? (b % 2 ? (2 * binmult(a, b / 2, mod) + a) % mod :
              (2 * binmult(a, b / 2, mod)) % mod) : 0;
}

/// Code here
vector<ll> gr[100001];
ll ans, mn[100001];
struct edg { ll x, y, z; };
vector<edg> vc;
unordered_map<ll, vector<ll>> dsu;

int main() {
  fast_io;
  ll n, i, x, y, z;
  cin >> n;
  for (i = 1; i <= n; i++) dsu[i] = {i}, mn[i] = i;
  for (i = 1; i < n; i++) {
    cin >> x >> y >> z;
    vc.pb({x, y, z});
    gr[x].pb(y), gr[y].pb(x);
  }
  sort(all(vc), [](edg a, edg b) { return a.z < b.z; });
  for (auto f : vc) {
    x = mn[f.x];
    y = mn[f.y];
    z = f.z;
    if (x == y) continue;
    if (dsu[x].size() < dsu[y].size()) swap(x, y);
    ans += dsu[x].size() * dsu[y].size() * z;
    for (auto g : dsu[y]) {
      dsu[x].pb(g);
      mn[g] = x;
    }
    dsu.erase(y);
  }
  cout << ans;
  //cerr << '\n' << "Time execute: " << clock() / (double)CLOCKS_PER_SEC << " sec" << '\n';
  return 0;
}

提出情報

提出日時
問題 D - Sum of Maximum Weights
ユーザ thirty_something
言語 C++ (GCC 9.2.1)
得点 400
コード長 2353 Byte
結果 AC
実行時間 163 ms
メモリ 23844 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 400 / 400
結果
AC × 2
AC × 20
セット名 テストケース
Sample example_00.txt, example_01.txt
All example_00.txt, example_01.txt, line.txt, linelike_00.txt, linelike_01.txt, linelike_02.txt, rand_00.txt, rand_01.txt, rand_02.txt, rand_03.txt, rand_04.txt, rand_05.txt, rand_06.txt, rand_07.txt, rand_08.txt, rand_09.txt, star.txt, starlike_00.txt, starlike_01.txt, starlike_02.txt
ケース名 結果 実行時間 メモリ
example_00.txt AC 12 ms 5812 KiB
example_01.txt AC 8 ms 5968 KiB
line.txt AC 161 ms 21424 KiB
linelike_00.txt AC 163 ms 22656 KiB
linelike_01.txt AC 161 ms 22772 KiB
linelike_02.txt AC 158 ms 22072 KiB
rand_00.txt AC 152 ms 23396 KiB
rand_01.txt AC 158 ms 23400 KiB
rand_02.txt AC 49 ms 11584 KiB
rand_03.txt AC 106 ms 18340 KiB
rand_04.txt AC 83 ms 15876 KiB
rand_05.txt AC 16 ms 7120 KiB
rand_06.txt AC 103 ms 18368 KiB
rand_07.txt AC 82 ms 15628 KiB
rand_08.txt AC 11 ms 6676 KiB
rand_09.txt AC 64 ms 13060 KiB
star.txt AC 136 ms 23300 KiB
starlike_00.txt AC 142 ms 23308 KiB
starlike_01.txt AC 143 ms 23356 KiB
starlike_02.txt AC 142 ms 23844 KiB