Submission #27977146


Source Code Expand

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

struct UnionFind {
  std::vector<int> parent_or_size;
  int cnt;

  UnionFind(int n) : parent_or_size(n, -1), cnt(n) {}

  void unite(int x, int y) {
    x = find_root(x);
    y = find_root(y);
    if (x == y) {
      return;
    }
    if (-parent_or_size[x] < -parent_or_size[y]) {
      std::swap(x, y);
    }
    parent_or_size[x] += parent_or_size[y];
    parent_or_size[y] = x;
    cnt--;
  }
  bool is_same_root(int x, int y) { return find_root(x) == find_root(y); }
  int find_root(int x) {
    if (parent_or_size[x] < 0) {
      return x;
    }
    return parent_or_size[x] = find_root(parent_or_size[x]);
  }
  int size(int x) { return -parent_or_size[find_root(x)]; }
};

int main() {
  int L, Q;
  std::cin >> L >> Q;

  std::vector<int> c(Q), x(Q);
  std::vector<int> cuts;

  cuts.push_back(0);
  for (int i = 0; i < Q; i++) {
    std::cin >> c[i] >> x[i];
    if (c[i] == 1) {
      cuts.push_back(x[i]);
    }
  }
  cuts.push_back(L);

  int siz = cuts.size();
  UnionFind uf_tree(siz - 1);

  sort(cuts.begin(), cuts.end());
  for (int i = 0; i < siz - 1; i++) {
    uf_tree.parent_or_size[i] = -(cuts[i + 1] - cuts[i]);
  }

  vector<int> ans;
  for (int i = Q - 1; i >= 0; i--) {
    int idx = std::lower_bound(cuts.begin(), cuts.end(), x[i]) - cuts.begin();

    if (c[i] == 1) {
      uf_tree.unite(idx, idx - 1);
    }
    if (c[i] == 2) {
      ans.push_back(uf_tree.size(idx - 1));
    }
  }

  reverse(ans.begin(), ans.end());
  for (int a : ans) {
    cout << a << "\n";
  }

  return 0;
}

Submission Info

Submission Time
Task D - Cutting Woods
User kira924age
Language C++ (GCC 9.2.1)
Score 400
Code Size 1673 Byte
Status AC
Exec Time 127 ms
Memory 6388 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 3
AC × 15
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_max_random_00.txt, 01_max_random_01.txt, 01_max_random_02.txt, 01_max_random_03.txt, 01_max_random_04.txt, 02_all_1_00.txt, 03_all_2_00.txt, 04_hack_00.txt, 04_hack_01.txt, 04_hack_02.txt, 04_hack_03.txt, 04_hack_04.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 8 ms 3460 KiB
00_sample_01.txt AC 4 ms 3596 KiB
00_sample_02.txt AC 3 ms 3592 KiB
01_max_random_00.txt AC 125 ms 6384 KiB
01_max_random_01.txt AC 127 ms 6388 KiB
01_max_random_02.txt AC 122 ms 6324 KiB
01_max_random_03.txt AC 125 ms 6164 KiB
01_max_random_04.txt AC 123 ms 6384 KiB
02_all_1_00.txt AC 127 ms 6316 KiB
03_all_2_00.txt AC 103 ms 5696 KiB
04_hack_00.txt AC 99 ms 6288 KiB
04_hack_01.txt AC 114 ms 6208 KiB
04_hack_02.txt AC 117 ms 6224 KiB
04_hack_03.txt AC 114 ms 6296 KiB
04_hack_04.txt AC 116 ms 6296 KiB