Advertisement
tien_noob

Dynamic MST (Change weight of kth edge)

Aug 15th, 2022
968
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. //Make CSP great again
  2. //Vengeance
  3. #include <bits/stdc++.h>
  4. #define TASK "TESTCODE"
  5. #define Log2(x) 31 - __builtin_clz(x)
  6. using namespace std;
  7. const int N = 2e4, M = 1e5;
  8. int last[M + 1];
  9. struct DSU
  10. {
  11.     int lab[N + 1];
  12.     void reset(int n)
  13.     {
  14.         fill(lab + 1, lab + n + 1, -1);
  15.     }
  16.     int FindSet(int u)
  17.     {
  18.         return lab[u] < 0 ? u : lab[u] = FindSet(lab[u]);
  19.     }
  20.     bool unite(int u, int v)
  21.     {
  22.         u = FindSet(u);
  23.         v = FindSet(v);
  24.         if (u == v)
  25.         {
  26.             return false;
  27.         }
  28.         if (lab[u] > lab[v])
  29.         {
  30.             swap(u, v);
  31.         }
  32.         lab[u] += lab[v];
  33.         lab[v] = u;
  34.         return true;
  35.     }
  36. } dsu1, dsu2;
  37. struct edge
  38. {
  39.     int l, r;
  40.     int u, v, w;
  41.     edge(int _l, int _r, int _u, int _v, int _w)
  42.     {
  43.         l = _l;
  44.         r = _r;
  45.         u = _u;
  46.         v = _v;
  47.         w = _w;
  48.     }
  49.     bool operator < (const edge & other) const
  50.     {
  51.         return w < other.w;
  52.     }
  53. };
  54. int x[M + 1], y[M + 1], w[M + 1], id[M + 1];
  55. int n, m, q;
  56. vector<edge> all;
  57. void read()
  58. {
  59.     cin >> n >> m >> q;
  60.     for (int i = 1; i <= m; ++ i)
  61.     {
  62.         cin >> x[i] >> y[i] >> w[i];
  63.     }
  64.     for (int i = 1; i <= q; ++ i)
  65.     {
  66.         int k, d;
  67.         cin >> k >> d;
  68.         all.emplace_back(last[k], i - 1, x[k], y[k], w[k]);
  69.         last[k] = i;
  70.         w[k] = d;
  71.     }
  72.     for (int i = 1; i <= m; ++ i)
  73.     {
  74.         all.emplace_back(last[i], q, x[i], y[i], w[i]);
  75.     }
  76.     sort(all.begin(), all.end());
  77. }
  78. void DnC(int l, int r, int n, vector<edge> e, long long sum)
  79. {
  80.     e.erase(stable_partition(e.begin(), e.end(), [&](const edge &u) {return !(u.r < l || u.l > r);}), e.end());
  81.     dsu1.reset(n);
  82.     dsu2.reset(n);
  83.     for (int i = 0; i < e.size(); ++ i)
  84.     {
  85.         if (e[i].r < r || e[i].l > l)
  86.         {
  87.             dsu1.unite(e[i].u, e[i].v);
  88.         }
  89.     }
  90.     for (int i = 0; i < e.size(); ++ i)
  91.     {
  92.         if (e[i].l <= l && e[i].r >= r)
  93.         {
  94.             if (dsu1.unite(e[i].u, e[i].v))
  95.             {
  96.                 sum += e[i].w;
  97.                 dsu2.unite(e[i].u, e[i].v);
  98.             }
  99.         }
  100.     }
  101.     if (l == r)
  102.     {
  103.         if (l > 0)
  104.         {
  105.             cout << sum << '\n';
  106.         }
  107.         return;
  108.     }
  109.     int sz = 0;
  110.     for (int i = 1; i <= n; ++ i)
  111.     {
  112.         if (dsu2.lab[i] < 0)
  113.         {
  114.             id[i] = ++sz;
  115.         }
  116.     }
  117.     dsu1.reset(n);
  118.     for (int i = 0; i < e.size(); ++ i)
  119.     {
  120.         e[i].u = id[dsu2.FindSet(e[i].u)];
  121.         e[i].v = id[dsu2.FindSet(e[i].v)];
  122.         if (e[i].l <= l && e[i].r >= r && !dsu1.unite(e[i].u, e[i].v))
  123.         {
  124.             e[i].r = -1e9;
  125.             e[i].l = 1e9;
  126.         }
  127.     }
  128.     int mid = (l + r)/2;
  129.     DnC(l, mid, sz, e, sum);
  130.     DnC(mid + 1, r, sz, e, sum);
  131. }
  132. void solve()
  133. {
  134.     DnC(0, q, n, all, 0);
  135. }
  136. int main()
  137. {
  138.     ios_base::sync_with_stdio(false);
  139.     cin.tie(nullptr);
  140.     if (fopen(TASK".INP", "r"))
  141.     {
  142.         freopen(TASK".INP", "r", stdin);
  143.         //freopen(TASK".OUT", "w", stdout);
  144.     }
  145.     int t = 1;
  146.     bool typetest = false;
  147.     if (typetest)
  148.     {
  149.         cin >> t;
  150.     }
  151.     for (int __ = 1; __ <= t; ++ __)
  152.     {
  153.         //cout << "Case " << __ << ": ";
  154.         read();
  155.         solve();
  156.     }
  157. }
  158.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement