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
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 |
|
|
|
| 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 |