记录编号 611353 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [THUPC 2025 Final] 食堂 最终得分 100
用户昵称 GravatarLikableP 是否通过 通过
代码语言 C++ 运行时间 121.057 s
提交时间 2026-01-28 13:26:10 内存使用 99.58 MiB
显示代码纯文本
#include <bits/stdc++.h>
typedef std::tuple<int, int, int> tuple;
signed main () {
  freopen("thupc_2025_dining.in", "r", stdin);
  freopen("thupc_2025_dining.out", "w", stdout);
  std::ios::sync_with_stdio(false); std::cin.tie(nullptr);
  int q; std::cin >> q; std::set<int> s0, s1[4], s2[4]; std::set<std::pair<int, int>> s; std::vector<int> w(q);
  auto id = [&] (int a, int b) {return (a + b) * (a + b + 1) / 2 + a;};
  auto get = [&] (int id) {int s = ceil((sqrt(9 + 8 * id) - 3) / 2), a = id - s * (s + 1) / 2; return std::make_pair(a, s - a);};
  auto add = [&] (int id, int u, int v, bool f = true) {
    if (!w[id]) s0.erase(id);
    for (int i = 0; i < 4; i++) if (!w[id] or w[id] == 1 << i) s1[i].erase(id);
    for (int i = 0; i < 4; i++) if (~w[id] >> i & 1) s2[i].erase(id);
    w[id] ^= 1 << (u << 1 | v);
    if (!w[id]) s0.insert(id);
    for (int i = 0; i < 4; i++) if (!w[id] or w[id] == 1 << i) s1[i].insert(id);
    for (int i = 0; i < 4; i++) if (~w[id] >> i & 1) s2[i].insert(id);
    if (f) {auto [a, b] = get(id); std::cout << 3 * a + u + 1 << ' ' << 3 * b + v + 1 << '\n';}
  };
  for (int i = 0; i < q; i++) {s0.insert(i); for (int j = 0; j < 4; j++) s1[j].insert(i), s2[j].insert(i);}
  for (int _ = 0; _ < q; _++) {
    int t; std::cin >> t;
    if (t == 1) {
      int o; std::cin >> o;
      if (o == 0) add(*s0.begin(), 0, 0);
      auto ask = [&] (const tuple &a) {
        auto [i, u, v] = a; auto [x, y] = get(i);
        return std::make_tuple(3 * (x + y) + 2 + u + v + u * v * 2, 3 * x + u, 3 * y + v);
      };
      auto checkmin = [&] (tuple &a, const tuple &b) {if (ask(a) > ask(b)) a = b;};
      if (o == 1) {
        tuple ans = std::make_tuple(q, 1, 1);
        for (int i = 0; i < 4; i++) checkmin(ans, std::make_tuple(*s1[3 - i].begin(), i >> 1, i & 1));
        auto [i, u, v] = ans; add(i, u, v);
      }
      if (o == 2) {
        tuple ans = std::make_tuple(q, 1, 1);
        for (int i = 0; i < 4; i++) checkmin(ans, std::make_tuple(*s2[i].begin(), i >> 1, i & 1));
        auto [i, u, v] = ans; add(i, u, v);
      }
    }
    if (t == 2) {
      int x, y; std::cin >> x >> y;
      int a = x / 3, b = y / 3, i = id(a, b);
      if (i >= q) {
        if (s.count(std::make_pair(x, y))) std::cout << "out\n", s.erase(std::make_pair(x, y));
        else std::cout << "in\n", s.insert(std::make_pair(x, y));
      }
      else {
        int u = x % 3 - 1, v = y % 3 - 1, p = u << 1 | v;
        std::cout << (w[i] >> p & 1 ? "out" : "in") << '\n'; add(i, u, v, false);
      }
    }
  }
  return 0;
}