제출 #1235359

#제출 시각아이디문제언어결과실행 시간메모리
1235359simplemind_31낙하산 고리들 (IOI12_rings)C++20
100 / 100
1312 ms166644 KiB
#include <bits/stdc++.h> #define ALL(x) x.begin(),x.end() using namespace std; int N,canticriti,asegu=-1,canticiclo,ideal,deberia; vector<int> degree,dsu,may3,posibilidad,cantiposi,dsuuu,degreeeeee; vector<vector<int>> graph; set<pair<int,int>> unidos; vector<bool> pertenececiclo; vector<int> nums_del_dfs; vector<bool> visitado; map<vector<int>,bool> examinado; int target=-1; void dfs(int now,int ante){ if(now==target){ //procesar; vector<int> copia(nums_del_dfs); sort(ALL(copia)); if(!examinado[copia]){ examinado[copia]=true; for(int i=0;i<copia.size();i++){ if(posibilidad[copia[i]]==deberia){ posibilidad[copia[i]]++; cantiposi[posibilidad[copia[i]]]++; }else{ posibilidad[copia[i]]=-1; } } deberia++; //cout << deberia << " aa"; } return; } for(auto u:graph[now]){ if(u==ante || visitado[u]){ continue; } nums_del_dfs.push_back(u); visitado[u]=true; dfs(u,now); nums_del_dfs.pop_back(); visitado[u]=false; } } int find(int x){return dsu[x]==x?x:dsu[x]=find(dsu[x]);} bool unite(int x,int y){ if((x=find(x))==(y=find(y))){ return false; } dsu[x]=y; return true; } void Init(int N_){ deberia=0; cantiposi.clear(); posibilidad.clear(); graph.clear(); degree.clear(); dsu.clear(); pertenececiclo.clear(); may3.clear(); canticiclo=ideal=0; graph.resize((canticriti=N=N_)+5); degree.resize(N+5); dsu.resize(N+5); cantiposi.resize(N+5); posibilidad.assign(N+5,0); pertenececiclo.assign(N+5,false); cantiposi[0]=N; for(int i=0;i<N;i++){ dsu[i]=i; } } void reinicar(){ Init(N); for(auto u:unidos){ if(u.first==asegu || u.second==asegu){ continue; } degree[u.first]++; degree[u.second]++; graph[u.first].push_back(u.second); graph[u.second].push_back(u.first); if(degree[u.first]>2 || degree[u.second]>2 || !unite(u.first,u.second)){ canticriti=0; return; } } canticriti=1; } void Link(int A,int B){ if(canticriti==0){ return; } if(asegu!=-1){ if(asegu!=A && asegu!=B){ degree[A]++; degree[B]++; graph[A].push_back(B); graph[B].push_back(A); //si encuentro ciclo entonces canti=0; if(degree[A]>2 || degree[B]>2 || !unite(A,B)){ canticriti=0; return; } } }else{ unidos.insert({min(A,B),max(A,B)}); degree[A]++; degree[B]++; graph[A].push_back(B); graph[B].push_back(A); if(!unite(A,B)){ // hacer un buen dfs(); visitado.clear(); nums_del_dfs.clear(); visitado.resize(N); nums_del_dfs.push_back(A); visitado[A]=true; target=B; dfs(A,B); } if(degree[A]>=4){ if(posibilidad[A]==deberia){ posibilidad[A]++; cantiposi[posibilidad[A]]++; }else{ posibilidad[A]=-1; } deberia++; } if(degree[B]>=4){ if(posibilidad[B]==deberia){ posibilidad[B]++; cantiposi[posibilidad[B]]++; }else{ posibilidad[B]=-1; } deberia++; } if(degree[A]==3){ may3.push_back(A); for(auto u:graph[A]){ if(posibilidad[u]==deberia){ posibilidad[u]++; cantiposi[posibilidad[u]]++; }else{ posibilidad[u]=-1; } } if(posibilidad[A]==deberia){ posibilidad[A]++; cantiposi[posibilidad[A]]++; }else{ posibilidad[A]=-1; } deberia++; } if(degree[B]==3){ may3.push_back(B); for(auto u:graph[B]){ if(posibilidad[u]==deberia){ posibilidad[u]++; cantiposi[posibilidad[u]]++; }else{ posibilidad[u]=-1; } } if(posibilidad[B]==deberia){ posibilidad[B]++; cantiposi[posibilidad[B]]++; }else{ posibilidad[B]=-1; } deberia++; } if(cantiposi[deberia]==1){ for(int i=0;i<N;i++){ if(posibilidad[i]==deberia){ asegu=i; reinicar(); return; } } } canticriti=cantiposi[deberia]; return; } } int CountCritical(){return canticriti;}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...