제출 #1150110

#제출 시각아이디문제언어결과실행 시간메모리
1150110enzy낙하산 고리들 (IOI12_rings)C++20
0 / 100
259 ms52060 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int n, resp, qtd3, viz[maxn], eh[maxn], pai[maxn], ciclo, qm, qm3;
vector<int>v[maxn];
bool ja=false;
void merge(int a, int b){
    pai[b]=a;
}
int find(int a){
    if(pai[a]==a) return a;
    return pai[a]=find(pai[a]);
}
void Init(int N_){
    resp = n = N_;
    for(int i=0;i<n;i++) pai[i]=i;
}
void Link(int a, int b){
    v[a].push_back(b);
    v[b].push_back(a);
    int na=find(a), nb=find(b);
    if(na==nb&&ciclo&&qm!=na) ciclo++;
    if(na!=nb) merge(na,nb);
    if(v[a].size()>=4){
        if(ja) resp=0;
        else if(qtd3==viz[a]+1) resp=1; // tem o proprio a
        ja=true;
    }
    if(v[b].size()>=4){
        if(ja) resp=0;
        else if(qtd3==viz[b]+1) resp=1; // tem o proprio b
        ja=true;
    }
    set<int>used;
    if(v[a].size()==3){
        qm=find(a);
        qtd3++; eh[a]++;
        int at=0;
        if(qtd3==viz[a]+eh[a]) at++;
        for(int i : v[a]){
            viz[i]++;
            used.insert(i);
            if(viz[i]+eh[i]==qtd3) at++;
        }
        resp=at;
        if(qtd3>=3) resp=0;
    }
    if(v[b].size()==3){
        qtd3++; eh[b]++;
        int at=0;
        if(qtd3==viz[b]+eh[b]) at++;
        for(int i : v[b]){
            if(used.count(i)) continue;
            viz[i]++;
            if(viz[i]+eh[i]==qtd3) at++;
        }
        resp=at;
        if(qtd3>=3) resp=0;
    }
    if((ciclo&&qtd3>=2)||ciclo>=2) resp=0;
}

int CountCritical(){
    return resp;
}
#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...