mr_dot_convict

RoadsInHackerland-Hackerrrank-mr.convict

May 17th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.27 KB | None | 0 0
  1. /*author* Priyanshu Shrivastav (from IIT Palakkad) *
  2.  * *_ __ ___  _ ______ ___  _ ____   ___  ___| |_  *
  3.  * | '_ ` _ \| '__/ __/ _ \| '_ \ \ / / |/ __| __| *
  4.  * | | | | | | | | (_| (_) | | | \ V /| | (__| |_  *
  5.  * |_| |_| |_|_|(_)___\___/|_| |_|\_/ |_|\___|\__| *
  6. When I wrote this, only God and I understood what I was doing
  7.  ** * * * * * * * Now, only God knows * * * * * * */
  8. #include         <bits/stdc++.h>
  9. #pragma GCC      optimize ("Ofast")
  10. #pragma GCC      optimize ("unroll-loops")
  11. #pragma GCC      target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  12.  
  13. #define IOS      ios_base::sync_with_stdio(false); cin.tie (nullptr)
  14. #define PREC     cout.precision (10); cout << fixed
  15. #define bg(x)    "[ " << #x << " : " << x << " ]"
  16. #define x        first
  17. #define y        second
  18. using namespace std;
  19.  
  20. const int N = (int)2e5 + 10;
  21.  
  22. int n, m;
  23.  
  24. struct Edge {
  25.    int u, v, w, id;
  26.    inline bool operator < (const Edge &o) const {
  27.       return w < o.w;
  28.    }
  29.    Edge rev () {
  30.       Edge e = {v, u, w, id};
  31.       return e;
  32.    }
  33. };
  34.  
  35. long long used[N];
  36. vector < vector <Edge> > T;
  37. vector <Edge> edges;
  38. vector <Edge> MST;
  39. int rep[N], rnk[N];
  40.  
  41. void makeSet() {
  42.    for(int i = 0; i < n; ++i)
  43.       rep[i] = i, rnk[i] = 0;
  44. }
  45.  
  46. int findSet(int u) {
  47.    int ru = u;
  48.    while (ru != rep[ru])
  49.       ru = rep[ru];
  50.  
  51.    while (u != rep[u]) {
  52.       int tmp = rep[u];
  53.       rep[u] = ru;
  54.       u = tmp;
  55.    }
  56.    return ru;
  57. }
  58.  
  59. void mergeSet(int u, int v) {
  60.    int ru = findSet(u), rv = findSet(v);
  61.    if (rnk[ru] > rnk[rv]) rep[rv] = rep[ru];
  62.    else rep[ru] = rep[rv];
  63.  
  64.    if (rnk[ru] == rnk[rv])
  65.       ++rnk[rv];
  66. }
  67.  
  68. void kruskals () {
  69.    sort (edges.begin(), edges.end());
  70.    makeSet();
  71.    int cnt = 0;
  72.  
  73.    for (Edge e : edges) {
  74.       int u = e.u, v = e.v;
  75.       if (findSet(u) == findSet(v)) continue;
  76.       mergeSet(u, v);
  77.       MST.push_back(e);
  78.       T[u].push_back(e);
  79.       T[v].push_back(e.rev());
  80.       ++cnt;
  81.    }
  82.  
  83.    assert (cnt == n - 1);
  84. }
  85.  
  86.  
  87. int dfs (int u, int pr, bool vis[]) {
  88.    vis[u] = true;
  89.    int cnt = 1;
  90.  
  91.    for (Edge e: T[u]) {
  92.       assert(e.u == u);
  93.       int v = e.v, w = e.w, id = e.id;
  94.       if (v == pr) continue;
  95.       if (!vis[v]) {
  96.         used[id] = 1ll * dfs (v, u, vis);
  97.         cnt += (int)used[id];
  98.       }
  99.    }
  100.    return cnt;
  101. }
  102.  
  103. void solve() {
  104.    kruskals();
  105.  
  106.    bool vis[N] = {0};
  107.    dfs(0, -1, vis);
  108.  
  109.    long long val[2 * N] = {0};
  110.    int mx = 0;
  111.    for (Edge e : MST) {
  112.       mx = max(mx, e.w);
  113.       val[e.w] = used[e.id] * (1ll * n - used[e.id]);
  114.    }
  115.  
  116.    vector <int> ans;
  117.    long long car = 0;
  118.    for (int i = 0; (car != 0 || i <= mx); ++i) {
  119.       val[i] += car;
  120.       if (val[i] % 2) {
  121.          val[i] -= 1;
  122.          ans.push_back(1);
  123.       }
  124.       else ans.push_back(0);
  125.       car = val[i] >> 1;
  126.    }
  127.    reverse(ans.begin(), ans.end());
  128.    for_each(ans.begin(), ans.end(), [](int bin) { cout << bin; });
  129.    cout << '\n';
  130. }
  131.  
  132. void read() {
  133.    cin >> n >> m;
  134.    T.assign(n, vector <Edge> ());
  135.    fill (used, used + n, 0);
  136.    edges.clear();
  137.    MST.clear();
  138.    int u, v, w;
  139.    for (int i = 0; i < m; ++i) {
  140.       cin >> u >> v >> w;
  141.       --u, --v;
  142.       edges.push_back({u, v, w, i});
  143.    }
  144. }
  145.  
  146. signed main() {
  147.    read();
  148.    solve();
  149.  
  150.    return EXIT_SUCCESS;
  151. }
Add Comment
Please, Sign In to add comment