Submission #23655903


Source Code Expand

#include <bits/stdc++.h>
#include "animals.h"

using namespace std;

using vi = vector<int>;
#define eb emplace_back

#define FOR(i, n) for (int i = 0; (i) < (int)(n); ++(i))
#define FOR3(i, m, n) for (int i = (m); (i) < (int)(n); ++(i))
#define FOR_R(i, n) for (int i = (int)(n)-1; (i) >= 0; --(i))
#define FOR3_R(i, m, n) for (int i = (int)(n)-1; (i) >= (int)(m); --(i))
#define all(x) x.begin(), x.end()

template <typename T>
struct Edge {
  int frm, to;
  T cost;
  int id;
  Edge(int a, int b, T c, int d) : frm(a), to(b), cost(c), id(d) {}
};

template <typename T>
struct Graph {
  int N, M;
  using edge_t = Edge<T>;
  vector<edge_t> edges;
  vector<vector<edge_t>> G;
  bool directed;
  Graph(int N, bool bl = false) : N(N), M(0), G(N), directed(bl) {}

  void add_edge(int frm, int to, T cost = 1) {
    auto e = edge_t(frm, to, cost, M);
    edges.eb(e);
    G[frm].eb(e);
    if (!directed) {
      auto e_rev = edge_t(to, frm, cost, M);
      G[to].eb(e_rev);
    }
    ++M;
  }

  vector<edge_t>& operator[](int v) { return G[v]; }
};

vi comp;  // 頂点 → 成分
vector<int> comp_size;
multiset<int> sz;
vector<bool> deleted;  // 削除済の辺
Graph<int> G(1 << 17);

void init(int N, int E[][2]) {
  comp.resize(N);
  deleted.resize(N - 1);
  FOR(i, N - 1) {
    auto a = E[i][0];
    auto b = E[i][1];
    G.add_edge(a, b);
  }
  sz.insert(N);
  comp_size.eb(N);
}

void rm_edge(Edge<int>& e) {
  deleted[e.id] = true;
  int u = e.frm, v = e.to;
  // 小さい連結成分を手に入れたい
  auto small_comp = [&]() -> vi {
    struct T {
      int v;
      int nxt;
      int ng;
    };
    vector<T> dfs[2];
    vi C[2];
    dfs[0].eb(T({u, 0, v}));
    dfs[1].eb(T({v, 0, u}));
    C[0].eb(u);
    C[1].eb(v);
    for (int t = 0;; t ^= 1) {
      if (dfs[t].empty()) return C[t];
      T data = dfs[t].back();
      dfs[t].pop_back();
      if (data.nxt == G[data.v].size()) continue;
      auto e = G[data.v][data.nxt];
      dfs[t].eb(T({data.v, data.nxt + 1, data.ng}));
      if (deleted[e.id]) continue;
      if (e.to == data.ng) continue;
      dfs[t].eb(T({e.to, 0, e.frm}));
      C[t].eb(e.to);
    }
  };

  auto C = small_comp();
  int c = comp[u];
  int new_c = comp_size.size();
  int sz1 = comp_size[c];
  int sz2 = C.size();
  int sz3 = sz1 - sz2;

  sz.erase(sz.find(sz1));
  sz.insert(sz2);
  sz.insert(sz3);

  comp_size.eb(sz2);
  comp_size[c] = sz3;
  for (auto&& v : C) {
    comp[v] = new_c;
  }
}

int query(int v) {
  for (auto&& e : G[v]) {
    if (deleted[e.id]) continue;
    rm_edge(e);
  }
  return *(--sz.end());
  // return 1;
}

Submission Info

Submission Time
Task A - むこのどうぶつたち と しんりんのはかい (Innocent Animals and Destruction of Forests)
User maspy
Language IOI-Style C++ (GCC 5.4.1)
Score 100
Code Size 2710 Byte
Status AC
Exec Time 651 ms
Memory 19372 KiB

Compile Error

./grader.cpp: In function ‘int main()’:
./grader.cpp:15:8: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   15 |   scanf("%d", &N);
      |   ~~~~~^~~~~~~~~~
./grader.cpp:17:10: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   17 |     scanf("%d%d", &(E[i][0]), &(E[i][1]));
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./grader.cpp:22:7: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   22 |  scanf("%d", &Q);
      |  ~~~~~^~~~~~~~~~

Judge Result

Set Name Subtask1 Subtask2 Subtask3
Score / Max Score 20 / 20 25 / 25 55 / 55
Status
AC × 19
AC × 11
AC × 16
Set Name Test Cases
Subtask1 subtask1/1, subtask1/10, subtask1/11, subtask1/12, subtask1/13, subtask1/14, subtask1/15, subtask1/16, subtask1/17, subtask1/18, subtask1/19, subtask1/2, subtask1/3, subtask1/4, subtask1/5, subtask1/6, subtask1/7, subtask1/8, subtask1/9
Subtask2 subtask2/1, subtask2/10, subtask2/11, subtask2/2, subtask2/3, subtask2/4, subtask2/5, subtask2/6, subtask2/7, subtask2/8, subtask2/9
Subtask3 subtask3/1, subtask3/10, subtask3/11, subtask3/12, subtask3/13, subtask3/14, subtask3/15, subtask3/16, subtask3/2, subtask3/3, subtask3/4, subtask3/5, subtask3/6, subtask3/7, subtask3/8, subtask3/9
Case Name Status Exec Time Memory
subtask1/1 AC 13 ms 6208 KiB
subtask1/10 AC 23 ms 6140 KiB
subtask1/11 AC 15 ms 6184 KiB
subtask1/12 AC 16 ms 6096 KiB
subtask1/13 AC 20 ms 6076 KiB
subtask1/14 AC 18 ms 6152 KiB
subtask1/15 AC 19 ms 6032 KiB
subtask1/16 AC 19 ms 6080 KiB
subtask1/17 AC 18 ms 6100 KiB
subtask1/18 AC 19 ms 6164 KiB
subtask1/19 AC 17 ms 6160 KiB
subtask1/2 AC 9 ms 6184 KiB
subtask1/3 AC 13 ms 6192 KiB
subtask1/4 AC 8 ms 6140 KiB
subtask1/5 AC 9 ms 6180 KiB
subtask1/6 AC 13 ms 6032 KiB
subtask1/7 AC 12 ms 6064 KiB
subtask1/8 AC 7 ms 6132 KiB
subtask1/9 AC 16 ms 6164 KiB
subtask2/1 AC 11 ms 6028 KiB
subtask2/10 AC 621 ms 18852 KiB
subtask2/11 AC 533 ms 18948 KiB
subtask2/2 AC 13 ms 6236 KiB
subtask2/3 AC 15 ms 6032 KiB
subtask2/4 AC 16 ms 6152 KiB
subtask2/5 AC 77 ms 7680 KiB
subtask2/6 AC 322 ms 12832 KiB
subtask2/7 AC 624 ms 18876 KiB
subtask2/8 AC 633 ms 18764 KiB
subtask2/9 AC 617 ms 19028 KiB
subtask3/1 AC 22 ms 6188 KiB
subtask3/10 AC 539 ms 18972 KiB
subtask3/11 AC 643 ms 19368 KiB
subtask3/12 AC 643 ms 19372 KiB
subtask3/13 AC 641 ms 19288 KiB
subtask3/14 AC 651 ms 19264 KiB
subtask3/15 AC 644 ms 19292 KiB
subtask3/16 AC 636 ms 19356 KiB
subtask3/2 AC 31 ms 6188 KiB
subtask3/3 AC 20 ms 6072 KiB
subtask3/4 AC 25 ms 6236 KiB
subtask3/5 AC 17 ms 6212 KiB
subtask3/6 AC 631 ms 18856 KiB
subtask3/7 AC 614 ms 18772 KiB
subtask3/8 AC 487 ms 18916 KiB
subtask3/9 AC 552 ms 18832 KiB