Submission #821790

#TimeUsernameProblemLanguageResultExecution timeMemory
821790annabeth9680Parachute rings (IOI12_rings)C++17
100 / 100
1399 ms125252 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6+20;
int N,cnt,casenum,cycnum,cycl,deg[MAXN],ha[MAXN],hb[MAXN];
vector<int> adj[MAXN];
struct dsu{
    int rep[MAXN],sz[MAXN];
    void init(int n){
        for(int i = 0;i<n;++i){
            rep[i] = i;
            sz[i] = 1;
        }
    }
    int gro(int x){
        return sz[finden(x)];
    }
    int finden(int x){
        return (rep[x] = (rep[x] == x) ? x : finden(rep[x]));
    }
    bool unite(int x, int y){
        x = finden(x); y = finden(y);
        if(x == y) return false;
        sz[y] += sz[x]; rep[x] = y;
        return true;
    }
}DSU;
struct fall{
    dsu D; int deg[MAXN]; bool ok = true; int u;
    void init(int u){
        fall::u = u;
        D.init(N); fill(deg,deg+N,0);
        for(int i = 0;i<cnt;++i){
            int a = ha[i], b = hb[i];
            if(a == u || b == u) continue;
            deg[a]++; deg[b]++;
            if(!D.unite(a,b)){
                ok = false;
            }
            if(deg[a] >= 3 || deg[b] >= 3){
                ok = false;
            }
        }
    }
    void link(){
        int i = cnt-1;
        int a = ha[i], b = hb[i];
        if(a == u || b == u) return;
        deg[a]++; deg[b]++;
        if(!D.unite(a,b)){
            ok = false;
        }
        if(deg[a] >= 3 || deg[b] >= 3){
            ok = false;
        }
    }
    bool check(){
        return ok;
    }
}falls[4];
void Init(int n){
    N = n;
    DSU.init(N);
}
bool f = false;
void Link(int a, int b){
    ha[cnt] = a; hb[cnt] = b; deg[a]++; deg[b]++; cnt++;
    adj[a].push_back(b); adj[b].push_back(a);
    if(f){
        for(int i = 0;i<casenum;++i) falls[i].link();
        return;
    }
    int u = -1;
    if(deg[a] >= 3) u = a;
    if(deg[b] >= 3) u = b;
    if(u == -1){
        if(!DSU.unite(a,b)){
            cycnum++;
            cycl += DSU.gro(a);
        }
        return;
    }
    f = true;
    falls[casenum++].init(u);
    for(auto v : adj[u]){
        falls[casenum++].init(v);
    }
}
int CountCritical(){
    if(f){
        int ans = 0;
        for(int i = 0;i<casenum;++i){
            if(falls[i].check()){
                ans++;
            }
        }
        return ans;
    }
    if(cycnum >= 2) return 0;
    if(cycnum == 1) return cycl;
    return N;
}
#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...