Advertisement
artemgf

Паутина Ананси

Jun 13th, 2018
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.60 KB | None | 0 0
  1. #pragma once
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #define _USE_MATH_DEFINES
  4. #include <iostream>
  5. #include <string>
  6. #include <map>
  7. #include <set>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <stdio.h>
  11. #include <cmath>
  12. #include <math.h>
  13. #include <queue>
  14. #include <stack>
  15. #include <climits>
  16. #include <deque>
  17. #include <ctime>
  18. #include <iomanip>
  19. #include <bitset>
  20. #include <unordered_map>
  21. #include <unordered_set>
  22.  
  23. using namespace std;
  24.  
  25. typedef long long ll;
  26. typedef unsigned long long ull;
  27. typedef unsigned int ui;
  28.  
  29. #define mh() make_heap()
  30. #define poph() pop_heap()
  31. #define pushh() push_heap()
  32. #define sor(n) n.begin(), n.end()
  33. #define rsor(n) n.rbegin(), n.rend()
  34. #define mp make_pair
  35. #define files freopen("input.txt", "rt", stdin); freopen("output.txt", "wt", stdout)
  36. #define p(T) pair<T,T>
  37. #define toch(x) cout.precision(x), cout.setf(ios::fixed)
  38. #define znac(l) abs(l)/l
  39. #define IOS ios::sync_with_stdio(false)
  40. #define IOSB cin.tie(0), cout.tie(0);
  41. const ll ok = ll(1e9 + 7);
  42.  
  43. int dsu_get(ll v, vector<ll> &pt) {
  44.     return (v == pt[v]) ? v : (pt[v] = dsu_get(pt[v],pt));
  45. }
  46.  
  47. void dsu_unite(ll a, ll b, vector<ll> &pt, vector<ll>&ras) {
  48.     a = dsu_get(a,pt);
  49.     b = dsu_get(b,pt);
  50.     if (ras[a]<ras[b])
  51.         swap(a, b);
  52.     if (a != b)
  53.         pt[a] = b;
  54.     if (ras[a] == ras[b])
  55.         ras[a]++;
  56. }
  57.  
  58. void dfs(ll a, vector<vector<ll>>mst, vector<bool> &used)
  59. {
  60.     stack<ll>next;
  61.     next.push(a);
  62.     while (!next.empty())
  63.     {
  64.         ll v = next.top();
  65.         next.pop();
  66.         used[v] = 1;
  67.         for (int i = 0; i < mst[v].size(); i++)
  68.         {
  69.             if (!used[mst[v][i]])
  70.             {
  71.                 next.push(mst[v][i]);
  72.             }
  73.         }
  74.     }
  75. }
  76. int main()
  77. {
  78.     IOSB;
  79.     IOS;
  80. #ifdef TheCompiler
  81.     files;
  82. #endif
  83.     ll n, k;
  84.     cin >> n >> k;
  85.     vector<ll> pt(n+1);
  86.     for (int i = 1; i <= n; i++)
  87.     {
  88.         pt[i] = i;
  89.     }
  90.     vector<p(ll)>graf(k);
  91.  
  92.     for (int i = 1; i <= k; i++)
  93.     {
  94.         ll a, b;
  95.         cin >> a >> b;
  96.         graf[i-1]={a,b};
  97.     }
  98.     ll q;
  99.     cin >> q;
  100.     ll compt = n;
  101.     vector<ll>zap(q);
  102.     vector<bool>us(k, 0);
  103.     vector<ll>ras(n + 1, 0);
  104.     for (int i = 1; i <= q; i++)
  105.     {
  106.         ll p;
  107.         cin >> p;
  108.         us[p - 1] = 1;
  109.         zap[i-1]=p-1;
  110.     }
  111.     for (int i = 0; i < graf.size(); i++)
  112.     {
  113.         if(!us[i])
  114.             if (dsu_get(graf[i].first, pt) != dsu_get(graf[i].second, pt))
  115.             {
  116.                 compt--;
  117.                 dsu_unite(graf[i].first, graf[i].second, pt,ras);
  118.             }
  119.     }
  120.     vector <ll>ans(q);
  121.     for (int i = zap.size() - 1; i >= 0; i--)
  122.     {
  123.         ans[i]=(compt);
  124.         if (dsu_get(graf[zap[i]].first, pt) != dsu_get(graf[zap[i]].second, pt))
  125.         {
  126.             compt--;
  127.             dsu_unite(graf[zap[i]].first, graf[zap[i]].second, pt,ras);
  128.         }
  129.     }
  130.     for (int i = 0; i <ans.size(); i++)
  131.     {
  132.         cout << ans[i] << " ";
  133.     }
  134.     return 0;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement