#include <bits/stdc++.h>
#define pb push_back
#define f first
#define s second
using namespace std;
const int Nn = 1e6 + 6;
bool cycle, rekt, f[Nn], us[Nn], in_cycle[Nn];
int n, ans, degreemax, p[Nn], sz[Nn];
set < pair < int , int > > st;
vector < int > v[Nn];
int P(int x) {
if (p[x] == x) return x;
return p[x] = P(p[x]);
}
void Init(int N_) {
n = ans = N_;
degreemax = 0;
for (int i = 0; i < n; ++i) {
st.insert({v[i].size(), i});
p[i] = i;
}
}
void dfs(int x, int p, int fn) {
in_cycle[x] = true;
if (x == fn) { cycle = true; return ; }
for (int i = 0; i < v[x].size(); ++i) {
int to = v[x][i];
if (to != p) dfs(to, x, fn);
if (cycle) return ;
}
in_cycle[x] = false;
}
void Link(int A, int B) {
int ap = P(A), bp = P(B);
if (ap != bp) {
if (sz[ap] < sz[bp]) swap(ap, bp);
sz[ap] += sz[bp];
p[bp] = ap;
}
else {
if (!cycle) {
dfs(A, A, B);
assert(cycle == true);
}
else
if (cycle) {
rekt = true;
}
}
st.erase(st.find({v[A].size(), A}));
st.erase(st.find({v[B].size(), B}));
v[A].pb(B), v[B].pb(A);
st.insert({v[A].size(), A});
st.insert({v[B].size(), B});
if (v[A].size() > v[degreemax].size()) {
degreemax = A;
}
if (v[B].size() > v[degreemax].size()) {
degreemax = B;
}
}
bool check(int x) {
if (cycle && !in_cycle[x]) return 0;
st.erase(st.find({v[x].size(), x}));
for (int i = 0; i < v[x].size(); ++i) {
int to = v[x][i];
st.erase(st.find({v[to].size(), to}));
st.insert({v[to].size() - 1, to});
}
bool ok = true;
if (st.size() && (*st.rbegin()).f > 2) ok = false;
for (int i = 0; i < v[x].size(); ++i) {
int to = v[x][i];
st.erase(st.find({v[to].size() - 1, to}));
st.insert({v[to].size(), to});
}
st.insert({v[x].size(), x});
return ok;
}
int CountCritical() {
if (rekt) return 0;
if (v[degreemax].size() <= 2) return n;
if (v[degreemax].size() > 3) {
if (cycle && !in_cycle[degreemax]) return 0;
st.erase(st.find({v[degreemax].size(), degreemax}));
if ((*st.rbegin()).f > 3) return 0;
st.insert({v[degreemax].size(), degreemax});
for (int i = 0; i < v[degreemax].size(); ++i) {
us[v[degreemax][i]] = true;
}
bool ok = true;
for (int i = 0; i < n; ++i) {
if (i != degreemax && !us[i] && v[i].size() > 2) {
ok = false;
break;
}
}
for (int i = 0; i < v[degreemax].size(); ++i) {
us[v[degreemax][i]] = false;
}
return ok;
}
if (v[degreemax].size() == 3) {
int res = 0;
res += check(degreemax);
res += check(v[degreemax][0]);
res += check(v[degreemax][1]);
res += check(v[degreemax][2]);
return res;
}
}
Compilation message
rings.cpp: In function 'void dfs(int, int, int)':
rings.cpp:33:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
33 | for (int i = 0; i < v[x].size(); ++i) {
| ~~^~~~~~~~~~~~~
rings.cpp: In function 'bool check(int)':
rings.cpp:77:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
77 | for (int i = 0; i < v[x].size(); ++i) {
| ~~^~~~~~~~~~~~~
rings.cpp:85:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
85 | for (int i = 0; i < v[x].size(); ++i) {
| ~~^~~~~~~~~~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:104:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
104 | for (int i = 0; i < v[degreemax].size(); ++i) {
| ~~^~~~~~~~~~~~~~~~~~~~~
rings.cpp:116:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
116 | for (int i = 0; i < v[degreemax].size(); ++i) {
| ~~^~~~~~~~~~~~~~~~~~~~~
rings.cpp:131:1: warning: control reaches end of non-void function [-Wreturn-type]
131 | }
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
23764 KB |
Output is correct |
2 |
Correct |
16 ms |
24216 KB |
Output is correct |
3 |
Correct |
17 ms |
24336 KB |
Output is correct |
4 |
Incorrect |
14 ms |
23892 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1821 ms |
75460 KB |
Output is correct |
2 |
Execution timed out |
4075 ms |
103344 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
23764 KB |
Output is correct |
2 |
Correct |
16 ms |
24216 KB |
Output is correct |
3 |
Correct |
17 ms |
24336 KB |
Output is correct |
4 |
Incorrect |
14 ms |
23892 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
23764 KB |
Output is correct |
2 |
Correct |
16 ms |
24216 KB |
Output is correct |
3 |
Correct |
17 ms |
24336 KB |
Output is correct |
4 |
Incorrect |
14 ms |
23892 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
23764 KB |
Output is correct |
2 |
Correct |
16 ms |
24216 KB |
Output is correct |
3 |
Correct |
17 ms |
24336 KB |
Output is correct |
4 |
Incorrect |
14 ms |
23892 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |