#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, len, 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) {
++len;
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;
--len;
}
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) {
if (!cycle) return n;
return len;
}
int res = 0;
for (int i = 0; i < n; ++i) {
res += check(i);
}
return res;
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:34:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
34 | for (int i = 0; i < v[x].size(); ++i) {
| ~~^~~~~~~~~~~~~
rings.cpp: In function 'bool check(int)':
rings.cpp:73:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
73 | for (int i = 0; i < v[x].size(); ++i) {
| ~~^~~~~~~~~~~~~
rings.cpp:81:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
81 | for (int i = 0; i < v[x].size(); ++i) {
| ~~^~~~~~~~~~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:110:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
110 | for (int i = 0; i < v[degreemax].size(); ++i) {
| ~~^~~~~~~~~~~~~~~~~~~~~
rings.cpp:122:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
122 | for (int i = 0; i < v[degreemax].size(); ++i) {
| ~~^~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
23764 KB |
Output is correct |
2 |
Correct |
25 ms |
24116 KB |
Output is correct |
3 |
Correct |
23 ms |
24280 KB |
Output is correct |
4 |
Correct |
15 ms |
23868 KB |
Output is correct |
5 |
Correct |
18 ms |
24148 KB |
Output is correct |
6 |
Correct |
18 ms |
24404 KB |
Output is correct |
7 |
Correct |
15 ms |
24024 KB |
Output is correct |
8 |
Incorrect |
17 ms |
24148 KB |
Output isn't correct |
9 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1798 ms |
68724 KB |
Output is correct |
2 |
Execution timed out |
4088 ms |
92560 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
23764 KB |
Output is correct |
2 |
Correct |
25 ms |
24116 KB |
Output is correct |
3 |
Correct |
23 ms |
24280 KB |
Output is correct |
4 |
Correct |
15 ms |
23868 KB |
Output is correct |
5 |
Correct |
18 ms |
24148 KB |
Output is correct |
6 |
Correct |
18 ms |
24404 KB |
Output is correct |
7 |
Correct |
15 ms |
24024 KB |
Output is correct |
8 |
Incorrect |
17 ms |
24148 KB |
Output isn't correct |
9 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
23764 KB |
Output is correct |
2 |
Correct |
25 ms |
24116 KB |
Output is correct |
3 |
Correct |
23 ms |
24280 KB |
Output is correct |
4 |
Correct |
15 ms |
23868 KB |
Output is correct |
5 |
Correct |
18 ms |
24148 KB |
Output is correct |
6 |
Correct |
18 ms |
24404 KB |
Output is correct |
7 |
Correct |
15 ms |
24024 KB |
Output is correct |
8 |
Incorrect |
17 ms |
24148 KB |
Output isn't correct |
9 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
23764 KB |
Output is correct |
2 |
Correct |
25 ms |
24116 KB |
Output is correct |
3 |
Correct |
23 ms |
24280 KB |
Output is correct |
4 |
Correct |
15 ms |
23868 KB |
Output is correct |
5 |
Correct |
18 ms |
24148 KB |
Output is correct |
6 |
Correct |
18 ms |
24404 KB |
Output is correct |
7 |
Correct |
15 ms |
24024 KB |
Output is correct |
8 |
Incorrect |
17 ms |
24148 KB |
Output isn't correct |
9 |
Halted |
0 ms |
0 KB |
- |