Submission #500286

#TimeUsernameProblemLanguageResultExecution timeMemory
500286600MihneaCollapse (JOI18_collapse)C++17
5 / 100
15084 ms6468 KiB
#include "collapse.h"
#include <bits/stdc++.h>

using namespace std;

vector<int> brute(int n, vector<int> t, vector<int> x, vector<int> y, vector<int> w, vector<int> p) {
  int m = (int)t.size();
  int q = (int)w.size();

  for (int i = 0; i < m; i++) {
    if (x[i] > y[i]) {
      swap(x[i], y[i]);
      assert(0 <= x[i] && x[i] < y[i] && y[i] < n);
    }
  }

  assert((int) t.size() == m);
  assert((int) x.size() == m);
  assert((int) y.size() == m);

  assert((int) w.size() == q);
  assert((int) p.size() == q);

  vector<int> sol((int) w.size());

  for (int iq = 0; iq < (int) w.size(); iq++) {
    set<pair<int, int>> s;
    for (int i = 0; i <= w[iq]; i++) {
      pair<int, int> cur = make_pair(x[i], y[i]);
      if (s.count(cur)) {
        s.erase(cur);
      } else {
        s.insert(cur);
      }
    }
    vector<pair<int, int>> ve;
    for (auto &it : s) {
      if (it.first <= p[iq] && it.second > p[iq]) {
        continue;
      }
      ve.push_back(it);
    }
    vector<int> t(n);
    iota(t.begin(), t.end(), 0);
    int comps = n;
    function<int(int)> getpap = [&] (int a) {
      if (t[a] == a) {
        return a;
      } else {
        return t[a] = getpap(t[a]);
      }
    };
    function<void(int, int)> unite = [&] (int a, int b) {
      a = getpap(a);
      b = getpap(b);
      if (a != b) {
        comps--;
        t[a] = b;
      }
    };
    for (auto &it : ve) {
      unite(it.first, it.second);
    }
    sol[iq] = comps;
  }
  return sol;
}

const int M = 333;

vector<int> smart(int n, vector<int> t, vector<int> x, vector<int> y, vector<int> w, vector<int> p) {
  int m = (int)t.size();
  int q = (int)w.size();

  vector<vector<int>> inds(m);
  for (int i = 0; i < q; i++) {
    inds[w[i]].push_back(i);
  }

  for (int i = 0; i < m; i++) {
    if (x[i] > y[i]) {
      swap(x[i], y[i]);
      assert(0 <= x[i] && x[i] < y[i] && y[i] < n);
    }
  }

  assert((int) t.size() == m);
  assert((int) x.size() == m);
  assert((int) y.size() == m);

  assert((int) w.size() == q);
  assert((int) p.size() == q);

  vector<int> sol((int) w.size());
  set<pair<int, int>> s;

  for (int step = 0; step < m; step++) {
    pair<int, int> cur = make_pair(x[step], y[step]);
    if (s.count(cur)) {
      s.erase(cur);
    } else {
      s.insert(cur);
    }
    for (auto &iq : inds[step]) {

      vector<pair<int, int>> ve;
      for (auto &it : s) {
        if (it.first <= p[iq] && it.second > p[iq]) {
          continue;
        }
        ve.push_back(it);
      }
      vector<int> t(n);
      iota(t.begin(), t.end(), 0);
      int comps = n;
      function<int(int)> getpap = [&] (int a) {
        if (t[a] == a) {
          return a;
        } else {
          return t[a] = getpap(t[a]);
        }
      };
      function<void(int, int)> unite = [&] (int a, int b) {
        a = getpap(a);
        b = getpap(b);
        if (a != b) {
          comps--;
          t[a] = b;
        }
      };
      for (auto &it : ve) {
        unite(it.first, it.second);
      }
      sol[iq] = comps;
    }
  }

  return sol;
}

vector<int> simulateCollapse(int N, vector<int> T, vector<int> X, vector<int> Y, vector<int> W, vector<int> P) {
	auto B=brute(N,T,X,Y,W,P);
	auto S=smart(N,T,X,Y,W,P);
	assert(B==S);
	return S;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...