#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;
int n;
vector<int>nodes[(int)1e6];
unordered_set<int>num3;
int num4=-1;
int num3n[(int)1e6];
int num_cycles;
unordered_set<int>cycle;
int dsu_has_cycle[(int)1e6];
int dsu_parent[(int)1e6];
int dsu_get(int a){
if(dsu_parent[a]<0)
return a;
return dsu_parent[a]=dsu_get(dsu_parent[a]);
}
void dsu_merge(int a,int b){
a=dsu_get(a);
b=dsu_get(b);
if(a==b)
return;
if(dsu_parent[a]>dsu_parent[b])
swap(a,b);
dsu_parent[a]+=dsu_parent[b];
dsu_has_cycle[a]=max(dsu_has_cycle[a],dsu_has_cycle[b]);
dsu_parent[b]=a;
}
void Init(int N){
n=N;
for(int i=0;i<1e6;i++)
dsu_parent[i]=-1;
}
int cvis;
int vis[(int)1e6];
int dfs(int node,int d,int end){ // -1 = dead end
int pv=vis[node];
vis[node]=cvis;
for(int ne:nodes[node]){
if(ne==end&&d>1)
return end;
if(vis[ne]!=cvis&&vis[ne]!=0)
return ne;
if(vis[ne]==0){
int r=dfs(ne,d+1,end);
if(r!=-1)
return r;
}
}
vis[node]=pv;
return -1;
}
void conn(int a,int b){
nodes[a].push_back(b);
if(nodes[a].size()==3){
num3.insert(a);
for(int ne:nodes[a])
num3n[ne]++;
}
if(nodes[a].size()==4){
num3.erase(a);
if(num4==-1)
num4=a;
else
num4=-2;
for(int ne:nodes[a])
num3n[ne]--;
}
}
void Link(int a,int b){
conn(a,b);
conn(b,a);
if(dsu_get(a)==dsu_get(b)){
if(num_cycles==0){
cvis++;
dfs(a,0,a);
//cout<<"cycle: ";
for(int i=0;i<1e6;i++)
if(vis[i]==cvis){
cycle.insert(i);
//cout<<i<<" ";
}
//cout<<"\n";
num_cycles=1;
dsu_has_cycle[dsu_get(a)]=1;
}else if(num_cycles==1){
if(dsu_has_cycle[dsu_get(a)]==0)
num_cycles=2;
else{
unordered_set<int>s;
for(int ne:nodes[a]){
cvis++;
int r=dfs(a,0,a);
if(r!=-1)
s.insert(r);
}
if(s.size()!=1){
num_cycles=2;
}else{
int center=*s.begin();
if(cycle.count(center))
cycle={center};
else
num_cycles=2;
}
}
}else{
num_cycles=2;
}
}else{
dsu_merge(a,b);
}
}
bool check(int i){
bool in_cycle=true;
if(num_cycles==1)
in_cycle=cycle.count(i);
return (num3n[i]==(int)num3.size()||(nodes[i].size()==3&&num3n[i]==(int)num3.size()-1))&&in_cycle;
}
int CountCritical(){
if(num_cycles>=2)
return 0;
if(num3.size()>4)
return 0;
if(num4==-2)
return 0;
if(num4!=-1){
bool in_cycle=true;
if(num_cycles==1)
in_cycle=cycle.count(num4);
return num3n[num4]==num3.size()&&in_cycle;
}
if(num3.empty()&&num_cycles==1)
return cycle.size();
if(num3.empty())
return n;
int res=0;
unordered_set<int>s;
for(int i:num3){
for(int ne:nodes[i]){
if(check(ne))
s.insert(ne);
}
if(check(i))
s.insert(i);
}
return (int)s.size();
}
Compilation message
rings.cpp: In function 'void Link(int, int)':
rings.cpp:104:25: warning: unused variable 'ne' [-Wunused-variable]
104 | for(int ne:nodes[a]){
| ^~
rings.cpp: In function 'int CountCritical()':
rings.cpp:147:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::unordered_set<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
147 | return num3n[num4]==num3.size()&&in_cycle;
| ~~~~~~~~~~~^~~~~~~~~~~~~
rings.cpp:156:9: warning: unused variable 'res' [-Wunused-variable]
156 | int res=0;
| ^~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
10 ms |
33116 KB |
Output is correct |
2 |
Correct |
10 ms |
33372 KB |
Output is correct |
3 |
Correct |
12 ms |
33224 KB |
Output is correct |
4 |
Correct |
10 ms |
33116 KB |
Output is correct |
5 |
Correct |
13 ms |
33368 KB |
Output is correct |
6 |
Correct |
13 ms |
33884 KB |
Output is correct |
7 |
Correct |
10 ms |
33116 KB |
Output is correct |
8 |
Correct |
11 ms |
33424 KB |
Output is correct |
9 |
Correct |
11 ms |
33372 KB |
Output is correct |
10 |
Correct |
12 ms |
33372 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
267 ms |
50940 KB |
Output is correct |
2 |
Correct |
794 ms |
62252 KB |
Output is correct |
3 |
Correct |
1164 ms |
71788 KB |
Output is correct |
4 |
Correct |
928 ms |
67452 KB |
Output is correct |
5 |
Correct |
985 ms |
71044 KB |
Output is correct |
6 |
Correct |
1248 ms |
126532 KB |
Output is correct |
7 |
Correct |
1204 ms |
72616 KB |
Output is correct |
8 |
Correct |
907 ms |
66644 KB |
Output is correct |
9 |
Correct |
981 ms |
68400 KB |
Output is correct |
10 |
Correct |
648 ms |
63928 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
10 ms |
33116 KB |
Output is correct |
2 |
Correct |
10 ms |
33372 KB |
Output is correct |
3 |
Correct |
12 ms |
33224 KB |
Output is correct |
4 |
Correct |
10 ms |
33116 KB |
Output is correct |
5 |
Correct |
13 ms |
33368 KB |
Output is correct |
6 |
Correct |
13 ms |
33884 KB |
Output is correct |
7 |
Correct |
10 ms |
33116 KB |
Output is correct |
8 |
Correct |
11 ms |
33424 KB |
Output is correct |
9 |
Correct |
11 ms |
33372 KB |
Output is correct |
10 |
Correct |
12 ms |
33372 KB |
Output is correct |
11 |
Incorrect |
12 ms |
33368 KB |
Output isn't correct |
12 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
10 ms |
33116 KB |
Output is correct |
2 |
Correct |
10 ms |
33372 KB |
Output is correct |
3 |
Correct |
12 ms |
33224 KB |
Output is correct |
4 |
Correct |
10 ms |
33116 KB |
Output is correct |
5 |
Correct |
13 ms |
33368 KB |
Output is correct |
6 |
Correct |
13 ms |
33884 KB |
Output is correct |
7 |
Correct |
10 ms |
33116 KB |
Output is correct |
8 |
Correct |
11 ms |
33424 KB |
Output is correct |
9 |
Correct |
11 ms |
33372 KB |
Output is correct |
10 |
Correct |
12 ms |
33372 KB |
Output is correct |
11 |
Incorrect |
12 ms |
33368 KB |
Output isn't correct |
12 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
10 ms |
33116 KB |
Output is correct |
2 |
Correct |
10 ms |
33372 KB |
Output is correct |
3 |
Correct |
12 ms |
33224 KB |
Output is correct |
4 |
Correct |
10 ms |
33116 KB |
Output is correct |
5 |
Correct |
13 ms |
33368 KB |
Output is correct |
6 |
Correct |
13 ms |
33884 KB |
Output is correct |
7 |
Correct |
10 ms |
33116 KB |
Output is correct |
8 |
Correct |
11 ms |
33424 KB |
Output is correct |
9 |
Correct |
11 ms |
33372 KB |
Output is correct |
10 |
Correct |
12 ms |
33372 KB |
Output is correct |
11 |
Correct |
267 ms |
50940 KB |
Output is correct |
12 |
Correct |
794 ms |
62252 KB |
Output is correct |
13 |
Correct |
1164 ms |
71788 KB |
Output is correct |
14 |
Correct |
928 ms |
67452 KB |
Output is correct |
15 |
Correct |
985 ms |
71044 KB |
Output is correct |
16 |
Correct |
1248 ms |
126532 KB |
Output is correct |
17 |
Correct |
1204 ms |
72616 KB |
Output is correct |
18 |
Correct |
907 ms |
66644 KB |
Output is correct |
19 |
Correct |
981 ms |
68400 KB |
Output is correct |
20 |
Correct |
648 ms |
63928 KB |
Output is correct |
21 |
Incorrect |
12 ms |
33368 KB |
Output isn't correct |
22 |
Halted |
0 ms |
0 KB |
- |