#include <bits/stdc++.h>
#define pb push_back
//#define DEBUGGING
using namespace std;
void __print(int i) { cerr << i; }
void __print(bool i) { cerr << (i ? "true" : "false"); }
template<typename T>
void __print(T& t) { cerr << "{"; int f = 0; for (auto& i : t) { cerr << (f++ ? ", " : ""); __print(i); } cerr << "}"; }
void _print() { cerr << "]\n"; }
template<typename T, typename... V>
void _print(T t, V... v) { __print(t); if (sizeof...(v)) cerr << ", "; _print(v...); }
#ifdef DEBUGGING
#define debug(x...) cerr <<"[" << (#x) << "] = ["; _print(x)
#else
#define debug(x...) 42
#endif
struct Node
{
int head;
int tail;
int size;
int nxt;
Node(int i) : head(i), tail(i), size(1), nxt(-1) {}
Node() : Node(-1) {}
};
constexpr static int MXN = 1e6;
int n;
set<int> p;
vector<int> g[MXN];
Node node[MXN];
bitset<MXN> in_loop;
vector<int> touching_loop;
int pred[MXN];
void merge(int a, int b);
void Init(int N_)
{
n = N_;
for (int i = 0; i < n; i++)
{
node[i] = Node(i);
p.insert(i);
}
for (int i = 0; i < n; i++)
{
pred[i] = -1;
}
}
void check(int node)
{
if (g[node].size() <= 2 || g[node].size() >= 5)
return;
set<int> p_new;
if (g[node].size() == 3)
for (int i : p)
if (i == node || find(g[node].begin(), g[node].end(), i) != g[node].end())
p_new.insert(i);
if (g[node].size() == 4)
for (int i : p)
if (i == node)
p_new.insert(i);
p = p_new;
}
set<int> current_a;
int visited[MXN];
bool visited_loop = false;
int counter = 0;
int lll = 1;
bool dfs(int node, int target)
{
if (in_loop[node] || (node == target && !visited_loop))
{
current_a.insert(node);
in_loop[node] = true;
return true;
}
if (node == target)
{
in_loop[node] = true;
return true;
}
bool valid = false;
visited[node] = lll;
for (int c : g[node])
{
if (visited[c] != lll && dfs(c, target))
{
debug(node, c);
valid = true;
}
}
if (valid && !visited_loop)
current_a.insert(node);
if (valid)
in_loop[node] = true;
return valid;
}
void assign_pred(int node, int pp)
{
pred[node] = pp;
visited[node] = lll;
for (int c : g[node])
if (visited[node] != lll)
assign_pred(c, node);
}
void check(int a, int b)
{
current_a.clear();
if (!visited_loop)
{
dfs(a, b);
lll++;
assign_pred(a, -1); // Create predecessors
}
else if (in_loop[a] && in_loop[b])
{
current_a.insert(a);
current_a.insert(b);
}
else if(!in_loop[a] && !in_loop[b])
{
int i = a;
for (; i != -1 || i != b || !in_loop[i]; i = pred[i])
in_loop[i] = true;
if (i == b)
{
p.clear();
return;
}
if (i != -1)
current_a.insert(i);
int j = b;
for (; j != -1 || j != a || !in_loop[j]; j = pred[j])
in_loop[j] = true;
if (j == a)
{
p.clear();
return;
}
if (j != -1)
current_a.insert(j);
// Finding two endpoints (they might the be same)
}
else
{
if (in_loop[b]) swap(a, b);
for (; !in_loop[b]; b = pred[b])
{
assert(b != -1); // It shouldn't happen since there is a loop in b's component
in_loop[b] = true;
}
current_a.insert(b);
}
for (auto it = current_a.begin(); it != current_a.end();)
if (p.find(*it) == p.end())
it = current_a.erase(it);
else
it++;
p = current_a;
visited_loop = true;
}
void Link(int a, int b)
{
if (p.empty())
return;
debug(a, b);
g[a].pb(b);
g[b].pb(a);
check(a);
check(b);
if (node[a].head == node[b].head)
check(a, b);
else
{
merge(node[a].head, node[b].head);
auto ddfs = [&] (int node, int pp) -> void
{
pred[node] = pp;
for (int c : g[node])
if (pred[c] == -1 && !in_loop[c])
dfs(c, node);
};
if (in_loop[a] || pred[a] != -1)
ddfs(b, a);
if (in_loop[b] || pred[b] != -1)
ddfs(a, b);
}
}
int CountCritical()
{
debug(p);
return p.size();
}
void merge(int a, int b)
{
if (node[a].size < node[b].size) swap(a, b);
node[a].size += node[b].size;
node[node[a].tail].nxt = b;
node[a].tail = node[b].tail;
for (;b != -1; b = node[b].nxt)
node[b].head = a;
}
Compilation message
rings.cpp: In function 'bool dfs(int, int)':
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
23 | #define debug(x...) 42
| ^~
rings.cpp:107:25: note: in expansion of macro 'debug'
107 | debug(node, c);
| ^~~~~
rings.cpp: In function 'void Link(int, int)':
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
23 | #define debug(x...) 42
| ^~
rings.cpp:190:9: note: in expansion of macro 'debug'
190 | debug(a, b);
| ^~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
23 | #define debug(x...) 42
| ^~
rings.cpp:216:9: note: in expansion of macro 'debug'
216 | debug(p);
| ^~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
39380 KB |
Output is correct |
2 |
Correct |
20 ms |
39768 KB |
Output is correct |
3 |
Correct |
20 ms |
39752 KB |
Output is correct |
4 |
Correct |
19 ms |
39456 KB |
Output is correct |
5 |
Correct |
21 ms |
39996 KB |
Output is correct |
6 |
Correct |
22 ms |
40308 KB |
Output is correct |
7 |
Correct |
19 ms |
39724 KB |
Output is correct |
8 |
Runtime error |
49 ms |
80588 KB |
Execution killed with signal 11 |
9 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
351 ms |
82232 KB |
Output is correct |
2 |
Correct |
979 ms |
94200 KB |
Output is correct |
3 |
Correct |
383 ms |
96776 KB |
Output is correct |
4 |
Correct |
1253 ms |
135220 KB |
Output is correct |
5 |
Correct |
1316 ms |
141516 KB |
Output is correct |
6 |
Correct |
1880 ms |
198128 KB |
Output is correct |
7 |
Correct |
371 ms |
103052 KB |
Output is correct |
8 |
Correct |
1133 ms |
125996 KB |
Output is correct |
9 |
Correct |
1279 ms |
134116 KB |
Output is correct |
10 |
Runtime error |
808 ms |
259360 KB |
Execution killed with signal 11 |
11 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
39380 KB |
Output is correct |
2 |
Correct |
20 ms |
39768 KB |
Output is correct |
3 |
Correct |
20 ms |
39752 KB |
Output is correct |
4 |
Correct |
19 ms |
39456 KB |
Output is correct |
5 |
Correct |
21 ms |
39996 KB |
Output is correct |
6 |
Correct |
22 ms |
40308 KB |
Output is correct |
7 |
Correct |
19 ms |
39724 KB |
Output is correct |
8 |
Runtime error |
49 ms |
80588 KB |
Execution killed with signal 11 |
9 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
39380 KB |
Output is correct |
2 |
Correct |
20 ms |
39768 KB |
Output is correct |
3 |
Correct |
20 ms |
39752 KB |
Output is correct |
4 |
Correct |
19 ms |
39456 KB |
Output is correct |
5 |
Correct |
21 ms |
39996 KB |
Output is correct |
6 |
Correct |
22 ms |
40308 KB |
Output is correct |
7 |
Correct |
19 ms |
39724 KB |
Output is correct |
8 |
Runtime error |
49 ms |
80588 KB |
Execution killed with signal 11 |
9 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
39380 KB |
Output is correct |
2 |
Correct |
20 ms |
39768 KB |
Output is correct |
3 |
Correct |
20 ms |
39752 KB |
Output is correct |
4 |
Correct |
19 ms |
39456 KB |
Output is correct |
5 |
Correct |
21 ms |
39996 KB |
Output is correct |
6 |
Correct |
22 ms |
40308 KB |
Output is correct |
7 |
Correct |
19 ms |
39724 KB |
Output is correct |
8 |
Runtime error |
49 ms |
80588 KB |
Execution killed with signal 11 |
9 |
Halted |
0 ms |
0 KB |
- |