답안 #15605

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
15605 2015-07-13T08:21:40 Z gs14004 낙하산 고리들 (IOI12_rings) C++14
52 / 100
4000 ms 151040 KB
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
 
vector<int> graph[1000005];
int n;
int deg[1000005];
int focus = -1;
bool deadend = 0;

vector<int> v;
int bad[4];

struct disj{
    int pa[1000005];
    int deg2[1000005];
    int deg3[1000005];
    int degx[1000005];
    int size[1000005];
    int without;

    void init(int n, int w){
        without = w;
        memset(degx, 0, sizeof(degx));
        memset(deg2, 0, sizeof(deg2));
        memset(deg3, 0, sizeof(deg3));
        for(int i=0; i<=n; i++) pa[i] = i, size[i] = 1;
    }
 
    int find(int x){
        return pa[x] = (pa[x] == x ? x : find(pa[x]));
    }
 
    void uni(int p, int q){
        if(p == without || q == without) return;
        degx[p]++;
        if(degx[p] == 2){
            deg2[find(p)]++;
        }
        if(degx[p] == 3){
            deg2[find(p)]--;
            deg3[find(p)]++;
        }
        degx[q]++;
        if(degx[q] == 2){
            deg2[find(q)]++;
        }
        if(degx[q] == 3){
            deg2[find(q)]--;
            deg3[find(q)]++;
        }
        p = find(p); q = find(q);
        if(p == q) return;
        pa[q] = p; find(q);
        deg2[p] += deg2[q];
        deg3[p] += deg3[q];
        size[p] += size[q];
    }

    bool ckBad(int x){
        x = find(x);
        return (deg3[x] || (deg2[x] == size[x]));
    }
}disj, wotree[4];
 
void Init(int N){
    n = N; 
    disj.init(n,-1);
}

void Link(int A, int B){
    deg[A]++, deg[B]++;
    if(deg[A] <= deg[B]){
        swap(A,B);
    }
    if(deg[A] == 3 && v.empty()){
        v.push_back(A);
        v.push_back(B);
        for(auto &i : graph[A]){
            v.push_back(i);
        }
        for(int i=0; i<v.size(); i++){
            wotree[i].init(n,v[i]);
            for(int j=0; j<n; j++){
                for(auto &k : graph[j]){
                    if(j < k) wotree[i].uni(j,k);
                }
            }
            for(int j=0; j<n; j++){
                if(j != v[i] && wotree[i].ckBad(j)){
                    bad[i] = 1;
                    break;
                }
            }
        }
    }
    graph[A].push_back(B);
    graph[B].push_back(A);
    disj.uni(A,B);
    if(v.empty()){
        if(disj.ckBad(A)){
            if(focus == -1){
                focus = A;
            }
            else if(disj.find(focus) != disj.find(A)){
                deadend = 1;
            }
        }
    }
    else{
        for(int i=0; i<v.size(); i++){
            wotree[i].uni(A,B);
            if(wotree[i].ckBad(A)){
                bad[i] = 1;
            }
        }
    }
}

 
int CountCritical(){
    if(deadend == 1) return 0;
    if(disj.without != -1) return 1;
    else if(!v.empty()){
        int cnt = 0;
        for(int i=0; i<v.size(); i++){
            if(!bad[i]) cnt++;
        }
        return cnt;
    }
    else{ 
        if(focus == -1) return n;
        return disj.size[disj.find(focus)];
    }
}

Compilation message

rings.cpp: In function 'void Link(int, int)':
rings.cpp:84:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0; i<v.size(); i++){
                      ~^~~~~~~~~
rings.cpp:113:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0; i<v.size(); i++){
                      ~^~~~~~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:128:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i=0; i<v.size(); i++){
                      ~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 35576 KB Output is correct
2 Correct 69 ms 83036 KB Output is correct
3 Correct 72 ms 83124 KB Output is correct
4 Correct 33 ms 83124 KB Output is correct
5 Correct 32 ms 83124 KB Output is correct
6 Correct 33 ms 83124 KB Output is correct
7 Correct 68 ms 83124 KB Output is correct
8 Correct 32 ms 83124 KB Output is correct
9 Correct 69 ms 83124 KB Output is correct
10 Correct 69 ms 83192 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 621 ms 83192 KB Output is correct
2 Correct 3936 ms 142388 KB Output is correct
3 Execution timed out 4024 ms 151040 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 35576 KB Output is correct
2 Correct 69 ms 83036 KB Output is correct
3 Correct 72 ms 83124 KB Output is correct
4 Correct 33 ms 83124 KB Output is correct
5 Correct 32 ms 83124 KB Output is correct
6 Correct 33 ms 83124 KB Output is correct
7 Correct 68 ms 83124 KB Output is correct
8 Correct 32 ms 83124 KB Output is correct
9 Correct 69 ms 83124 KB Output is correct
10 Correct 69 ms 83192 KB Output is correct
11 Correct 82 ms 151040 KB Output is correct
12 Correct 76 ms 151040 KB Output is correct
13 Correct 78 ms 151040 KB Output is correct
14 Correct 71 ms 151040 KB Output is correct
15 Correct 73 ms 151040 KB Output is correct
16 Correct 36 ms 151040 KB Output is correct
17 Correct 73 ms 151040 KB Output is correct
18 Correct 78 ms 151040 KB Output is correct
19 Correct 37 ms 151040 KB Output is correct
20 Correct 79 ms 151040 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 35576 KB Output is correct
2 Correct 69 ms 83036 KB Output is correct
3 Correct 72 ms 83124 KB Output is correct
4 Correct 33 ms 83124 KB Output is correct
5 Correct 32 ms 83124 KB Output is correct
6 Correct 33 ms 83124 KB Output is correct
7 Correct 68 ms 83124 KB Output is correct
8 Correct 32 ms 83124 KB Output is correct
9 Correct 69 ms 83124 KB Output is correct
10 Correct 69 ms 83192 KB Output is correct
11 Correct 82 ms 151040 KB Output is correct
12 Correct 76 ms 151040 KB Output is correct
13 Correct 78 ms 151040 KB Output is correct
14 Correct 71 ms 151040 KB Output is correct
15 Correct 73 ms 151040 KB Output is correct
16 Correct 36 ms 151040 KB Output is correct
17 Correct 73 ms 151040 KB Output is correct
18 Correct 78 ms 151040 KB Output is correct
19 Correct 37 ms 151040 KB Output is correct
20 Correct 79 ms 151040 KB Output is correct
21 Correct 52 ms 151040 KB Output is correct
22 Correct 68 ms 151040 KB Output is correct
23 Correct 79 ms 151040 KB Output is correct
24 Correct 163 ms 151040 KB Output is correct
25 Correct 93 ms 151040 KB Output is correct
26 Correct 169 ms 151040 KB Output is correct
27 Correct 88 ms 151040 KB Output is correct
28 Correct 227 ms 151040 KB Output is correct
29 Correct 164 ms 151040 KB Output is correct
30 Correct 106 ms 151040 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 35576 KB Output is correct
2 Correct 69 ms 83036 KB Output is correct
3 Correct 72 ms 83124 KB Output is correct
4 Correct 33 ms 83124 KB Output is correct
5 Correct 32 ms 83124 KB Output is correct
6 Correct 33 ms 83124 KB Output is correct
7 Correct 68 ms 83124 KB Output is correct
8 Correct 32 ms 83124 KB Output is correct
9 Correct 69 ms 83124 KB Output is correct
10 Correct 69 ms 83192 KB Output is correct
11 Correct 621 ms 83192 KB Output is correct
12 Correct 3936 ms 142388 KB Output is correct
13 Execution timed out 4024 ms 151040 KB Time limit exceeded
14 Halted 0 ms 0 KB -