Submission #415531

#TimeUsernameProblemLanguageResultExecution timeMemory
415531Pro_ktmrParachute rings (IOI12_rings)C++17
100 / 100
2280 ms141600 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define all(x) x.begin(), x.end()
#define rep(i, n) for(int (i)=0; (i)<(n); (i)++)
#define repi(i, a, b) for(int (i)=(a); (i)<(b); (i)++)

struct UnionFind{
    int N;
    vector<int> par, siz, dig;
    int exc;
    bool ok = true;
    void init(int n, int _exc){
        N = n;
        par = vector<int>(N, -1);
        siz = vector<int>(N, 1);
        exc = _exc;
        dig = vector<int>(N, 0);
    }
    int root(int a){
        if(par[a] == -1) return a;
        return par[a] = root(par[a]);
    }
    int unite(int a, int b){
        if(a == exc || b == exc) return 1;
        dig[a]++; dig[b]++;
        ok &= (dig[a] <= 2 && dig[b] <= 2);
        int ra = root(a), rb = root(b);
        if(ra == rb){
            ok = false;
            return 0;
        }
        if(siz[ra] > siz[rb]){
            par[rb] = ra;
            siz[ra] += siz[rb];
        }
        else{
            par[ra] = rb;
            siz[rb] += siz[ra];
        }
        return 1;
    }
    bool isSame(int a, int b){
        return root(a) == root(b);
    }
    int size(int a){
        return siz[root(a)];
    }
};

int N;
int phase = 2, circle = 0, C = 0;
vector<pair<int,int>> note;
vector<int> e[1000000];
UnionFind base, spec[4], spec4;

void Init(int N_) {
    N = N_;
    base.init(N, -1);
}

void Link(int A, int B) {
    note.pb({A,B});
    e[A].pb(B);
    e[B].pb(A);
    if(phase == 2){
        if(e[A].size() == 3){
            phase = 3;
            spec[0].init(N, A);
            rep(i, 3) spec[i+1].init(N, e[A][i]);
            rep(i, 4) for(auto [a,b]:note){
                spec[i].unite(a, b);
            }
            return;
        }
        if(e[B].size() == 3){
            phase = 3;
            spec[0].init(N, B);
            rep(i, 3) spec[i+1].init(N, e[B][i]);
            rep(i, 4) for(auto [a,b]:note){
                spec[i].unite(a, b);
            }
            return;
        }
        if(base.unite(A, B) == 0){
            circle++;
            if(circle == 1){
                C = base.size(A);
                return;
            }
        }
    }
    else if(phase == 3){
        if(e[A].size() == 4){
            phase = 4;
            spec4.init(N, A);
            for(auto [a,b]:note){
                spec4.unite(a, b);
            }
            return;
        }
        if(e[B].size() == 4){
            phase = 4;
            spec4.init(N, B);
            for(auto [a,b]:note){
                spec4.unite(a, b);
            }
            return;
        }
        rep(i, 4) spec[i].unite(A, B);
    }
    else{
        spec4.unite(A, B);
    }
}

int CountCritical() {
    if(phase == 2){
        if(circle == 0) return N;
        else if(circle == 1) return C;
        else return 0;
    }
    else if(phase == 3){
        return (int)spec[0].ok + (int)spec[1].ok + (int)spec[2].ok + (int)spec[3].ok;
    }
    else{
        return (int)spec4.ok;
    }
    return -1;
}

Compilation message (stderr)

rings.cpp: In function 'void Link(int, int)':
rings.cpp:5:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    5 | #define rep(i, n) for(int (i)=0; (i)<(n); (i)++)
      |                           ^
rings.cpp:70:13: note: in expansion of macro 'rep'
   70 |             rep(i, 3) spec[i+1].init(N, e[A][i]);
      |             ^~~
rings.cpp:5:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    5 | #define rep(i, n) for(int (i)=0; (i)<(n); (i)++)
      |                           ^
rings.cpp:71:13: note: in expansion of macro 'rep'
   71 |             rep(i, 4) for(auto [a,b]:note){
      |             ^~~
rings.cpp:5:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    5 | #define rep(i, n) for(int (i)=0; (i)<(n); (i)++)
      |                           ^
rings.cpp:79:13: note: in expansion of macro 'rep'
   79 |             rep(i, 3) spec[i+1].init(N, e[B][i]);
      |             ^~~
rings.cpp:5:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    5 | #define rep(i, n) for(int (i)=0; (i)<(n); (i)++)
      |                           ^
rings.cpp:80:13: note: in expansion of macro 'rep'
   80 |             rep(i, 4) for(auto [a,b]:note){
      |             ^~~
rings.cpp:5:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    5 | #define rep(i, n) for(int (i)=0; (i)<(n); (i)++)
      |                           ^
rings.cpp:110:9: note: in expansion of macro 'rep'
  110 |         rep(i, 4) spec[i].unite(A, B);
      |         ^~~
#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...