답안 #658103

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
658103 2022-11-12T07:38:38 Z jiahng 낙하산 고리들 (IOI12_rings) C++14
38 / 100
4000 ms 198204 KB
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
#define ll int
typedef pair<int,int> pi;
typedef vector <int> vi;
typedef vector <pi> vpi;
typedef pair<pi, ll> pii;
typedef set <ll> si;
typedef long double ld;
#define f first
#define s second
#define mp make_pair
#define FOR(i,s,e) for(int i=s;i<=int(e);++i)
#define DEC(i,s,e) for(int i=s;i>=int(e);--i)
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define lbd(x, y) lower_bound(all(x), y)
#define ubd(x, y) upper_bound(all(x), y)
#define aFOR(i,x) for (auto i: x)
#define mem(x,i) memset(x,i,sizeof x)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define maxn 1000010
#define INF (ll)1e9
#define MOD 1000000007
typedef pair <vi, int> pvi;
typedef pair <int,pi> ipi;
typedef vector <pii> vpii;
int N;
set <int> st[maxn];
int d[maxn];
int maxD;
vi adj[maxn];
 
vpi all_edges;
int p[6][maxn];
int edges[6][maxn], sz[6][maxn];
set <int> cycles[6];
vi pos;
int fl(int i, int x){
    if (p[i][x] == x) return x;
    return p[i][x] = fl(i, p[i][x]);
}
 
void add(int i, int A, int B){
    edges[i][fl(i,B)]++;
    if (fl(i, A) != fl(i,B)){
        int pA = fl(i,A), pB = fl(i,B);
        sz[i][pB] += sz[i][pA];
        edges[i][pB] += edges[i][pA];
        if (cycles[i].find(pA) != cycles[i].end()) cycles[i].erase(pA);
        p[i][pA] = pB;
    }
    if (edges[i][fl(i,B)] >= sz[i][fl(i,B)]) cycles[i].insert(fl(i,B));
}
int bigx;
int gt3 = 0;

void Init(int N_) {
    N = N_;
    maxD = 0;
    FOR(i,0,5) FOR(j,0,N-1) p[i][j] = j,sz[i][j] = 1,edges[i][j]  =0;
    FOR(i,0,N-1){
        adj[i].clear(); st[i].clear();
    }
    FOR(i,0,5) cycles[i].clear();
    FOR(i,0,N-1) d[i] = 0;
    FOR(i,0,N-1) st[0].insert(i);
    all_edges.clear();
    
    bigx = -1;
}
void Link(int A, int B) {
    st[d[A]].erase(A); st[d[B]].erase(B);
    if (d[A] == 3) gt3++;
    if (d[B] == 3) gt3++;
    d[A]++; d[B]++;
    st[d[A]].insert(A); st[d[B]].insert(B);
 
    adj[A].pb(B); adj[B].pb(A);
 
    if (pos.empty() && (d[A] == 3 || d[B] == 3)){
        if (d[A] == 3){
            aFOR(i, adj[A]) pos.pb(i);
            pos.pb(A);
        }else if (d[B] == 3){
            pos.pb(B); aFOR(i, adj[B]) pos.pb(i);
        }
        FOR(i,0,pos.size()-1){
            aFOR(j, all_edges) if (j.f != pos[i] && j.s != pos[i]) add(i,j.f,j.s);
        }
    }
    
 
    if (bigx == -1 && (d[A] >= 4 || d[B] >= 4)){
        if (d[A] >= 4) bigx = A;
        else if (d[B] >= 4) bigx = B;
        aFOR(i, all_edges) if (i.f != bigx && i.s != bigx) add(4,i.f,i.s);
    }
    
    all_edges.pb(pi(A,B));
    maxD = max({maxD, d[A], d[B]});
 
    add(5,A,B);
    FOR(i,0,(int)pos.size()-1) if (A != pos[i] && B != pos[i]) add(i,A,B);
    if (bigx != -1 && A != bigx && B != bigx) add(4, A, B);
}
 
int CountCritical() {
    if (N == 1) return 1;
    if (maxD >= 4){
        if (gt3 > 1) return 0;
        if (st[maxD].size() == 1){
            int x = *st[maxD].begin();
            bool no = 0;
            if (!cycles[4].empty()) no = 1;
            aFOR(i, st[3]) if (find(all(adj[i]), x) == adj[i].end()){
                no = 1; break;
            }
            if (no) return 0;
            return 1;
        }else return 0;
    }else if (maxD <= 1) return N;
    else if (maxD == 3){
        if (st[3].size() > 4) return 0;
       
        int ans = 0;
        FOR(i,0,pos.size()-1){
            bool no = 0;
            aFOR(j, st[3]) if (pos[i] != j && find(all(adj[j]), pos[i]) == adj[j].end()){
                no = 1; break;
            }
            if (no) continue;
            if (cycles[i].empty()){
                //cout << "! " << i << '\n';
                ans++;
            }
        }
        return ans;
    }else{
        if (cycles[5].size() == 0) return N;
        else if (cycles[5].size() == 1) return sz[5][fl(5,*cycles[5].begin())];
        else return 0;
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 70856 KB Output is correct
2 Correct 37 ms 71496 KB Output is correct
3 Correct 43 ms 71756 KB Output is correct
4 Correct 34 ms 70988 KB Output is correct
5 Correct 37 ms 71360 KB Output is correct
6 Correct 38 ms 71700 KB Output is correct
7 Correct 34 ms 71512 KB Output is correct
8 Correct 36 ms 71556 KB Output is correct
9 Correct 45 ms 71672 KB Output is correct
10 Correct 38 ms 71764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1972 ms 154384 KB Output is correct
2 Execution timed out 4086 ms 198204 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 70856 KB Output is correct
2 Correct 37 ms 71496 KB Output is correct
3 Correct 43 ms 71756 KB Output is correct
4 Correct 34 ms 70988 KB Output is correct
5 Correct 37 ms 71360 KB Output is correct
6 Correct 38 ms 71700 KB Output is correct
7 Correct 34 ms 71512 KB Output is correct
8 Correct 36 ms 71556 KB Output is correct
9 Correct 45 ms 71672 KB Output is correct
10 Correct 38 ms 71764 KB Output is correct
11 Correct 39 ms 71648 KB Output is correct
12 Correct 48 ms 72528 KB Output is correct
13 Correct 52 ms 72484 KB Output is correct
14 Correct 51 ms 72308 KB Output is correct
15 Correct 49 ms 73520 KB Output is correct
16 Correct 44 ms 72484 KB Output is correct
17 Correct 50 ms 72524 KB Output is correct
18 Correct 59 ms 73832 KB Output is correct
19 Correct 47 ms 72588 KB Output is correct
20 Correct 47 ms 72580 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 70856 KB Output is correct
2 Correct 37 ms 71496 KB Output is correct
3 Correct 43 ms 71756 KB Output is correct
4 Correct 34 ms 70988 KB Output is correct
5 Correct 37 ms 71360 KB Output is correct
6 Correct 38 ms 71700 KB Output is correct
7 Correct 34 ms 71512 KB Output is correct
8 Correct 36 ms 71556 KB Output is correct
9 Correct 45 ms 71672 KB Output is correct
10 Correct 38 ms 71764 KB Output is correct
11 Correct 39 ms 71648 KB Output is correct
12 Correct 48 ms 72528 KB Output is correct
13 Correct 52 ms 72484 KB Output is correct
14 Correct 51 ms 72308 KB Output is correct
15 Correct 49 ms 73520 KB Output is correct
16 Correct 44 ms 72484 KB Output is correct
17 Correct 50 ms 72524 KB Output is correct
18 Correct 59 ms 73832 KB Output is correct
19 Correct 47 ms 72588 KB Output is correct
20 Correct 47 ms 72580 KB Output is correct
21 Correct 83 ms 78220 KB Output is correct
22 Correct 125 ms 82488 KB Output is correct
23 Correct 159 ms 85608 KB Output is correct
24 Execution timed out 4090 ms 84128 KB Time limit exceeded
25 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 70856 KB Output is correct
2 Correct 37 ms 71496 KB Output is correct
3 Correct 43 ms 71756 KB Output is correct
4 Correct 34 ms 70988 KB Output is correct
5 Correct 37 ms 71360 KB Output is correct
6 Correct 38 ms 71700 KB Output is correct
7 Correct 34 ms 71512 KB Output is correct
8 Correct 36 ms 71556 KB Output is correct
9 Correct 45 ms 71672 KB Output is correct
10 Correct 38 ms 71764 KB Output is correct
11 Correct 1972 ms 154384 KB Output is correct
12 Execution timed out 4086 ms 198204 KB Time limit exceeded
13 Halted 0 ms 0 KB -