Advertisement
Alex_tz307

USACO 2016 US Open Contest, Gold Problem 2. Closing the Farm

Mar 13th, 2021
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream fin("closing.in");
  6. ofstream fout("closing.out");
  7.  
  8. class DSU {
  9.     public:
  10.         int N;
  11.         vector<int> p, r;
  12.  
  13.         DSU(int n) : N(n) {
  14.             p.resize(N + 1), r.assign(N + 1, 1);
  15.             iota(p.begin(), p.end(), 0);
  16.         }
  17.  
  18.         int get(int x) {
  19.             return (x == p[x] ? x : (p[x] = get(p[x])));
  20.         }
  21.  
  22.         bool connected(int u, int v) {
  23.             int x = get(u),
  24.                 y = get(v);
  25.             return x == y;
  26.         }
  27.  
  28.         bool unite(int u, int v) {
  29.             int x = get(u),
  30.                 y = get(v);
  31.             if(x == y)
  32.                 return false;
  33.             if(r[x] == r[y])
  34.                 ++r[x];
  35.             if(r[x] > r[y]) {
  36.                 p[y] = x;
  37.                 r[x] += r[y];
  38.             }
  39.             else {
  40.                p[x] = y;
  41.                r[y] += r[x];
  42.             }
  43.             return true;
  44.         }
  45. };
  46.  
  47. const int NMAX = 2e5 + 5;
  48. int N, M, u[NMAX], v[NMAX], a[NMAX], poz[NMAX], comps;
  49. vector<int> G[NMAX];
  50. vector<bool> sol;
  51.  
  52. int main() {
  53.     fin >> N >> M;
  54.     DSU tree(N);
  55.     for(int i = 0; i < M; ++i)
  56.         fin >> u[i] >> v[i];
  57.     for(int i = 0; i < N; ++i) {
  58.         fin >> a[i];
  59.         poz[a[i]] = i;
  60.     }
  61.     for(int i = 0; i < M; ++i)
  62.         if(poz[u[i]] < poz[v[i]])
  63.             G[u[i]].emplace_back(v[i]);
  64.         else
  65.             G[v[i]].emplace_back(u[i]);
  66.     for(int i = N - 1; i >= 0; --i) {
  67.         int u = a[i];
  68.         ++comps;
  69.         for(const int &v : G[u])
  70.             if(!tree.connected(u, v)) {
  71.                 --comps;
  72.                 tree.unite(u, v);
  73.             }
  74.         sol.emplace_back(comps == 1);
  75.     }
  76.     reverse(sol.begin(), sol.end());
  77.     for(const bool &x : sol)
  78.         fout << (x ? "YES\n" : "NO\n");
  79. }
  80.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement