답안 #104287

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
104287 2019-04-04T17:55:33 Z naoai 낙하산 고리들 (IOI12_rings) C++14
100 / 100
3365 ms 157896 KB
#include <bits/stdc++.h>

using namespace std;

const int nmax = 1e6 + 5;

static int n;
static vector<int> ciclu;
static vector<int> cen, g3, trk;
static vector<int> vec[nmax + 1];

struct Str {
    bool valid;
    int grad[nmax + 1], t[nmax + 1];
    int g[nmax + 1];

    void init () {
        valid = 1;
        for (int i = 0; i < n; ++ i) {
            grad[i] = 1;
            t[i] = i;
        }
    }

    inline int find_tata (int x) {
        if (x == t[x]) return x;
        return t[x] = find_tata(t[x]);
    }

    void link (int A, int B, int type = -1) {
        ++ g[A]; ++ g[B];
        if (type == 1) {
            vec[A].push_back(B);
            vec[B].push_back(A);
        }

        if (valid == 0)
            return ;

        if (g[A] < 3 && g[B] < 3) {
            int la = find_tata(A);
            int lb = find_tata(B);

            if (la == lb) { // apare ciclu
                if (!(type == 1 && (g[A] == 2 && g[B] == 2)))
                    valid = 0;
            } else {
                if (grad[la] < grad[lb]) {
                    swap(la, lb);
                    swap(A, B);
                }

                grad[la] += grad[lb];
                t[lb] = la;
            }
        } else
            valid = 0;
    }
} root, s3[7];

vector<pair<int, int>> e;
int centered;

void Init(int N_) {
    n = N_;
    centered = -1;
    root.init();
}

bool nuexista (int i) {
    bool ok = 1;
    for (auto j : trk)
        if (i == j) ok = 0;
    return ok;
}

void invalideaza (int x) {
    for (int i = 0; i < trk.size(); ++ i) {
        if (trk[i] == x) continue;

        bool ok = 0;
        for (auto j : vec[x])
            if (trk[i] == j)
                ok = 1;

        if (ok == 0) {
            s3[i].valid = 0;
        }
    }
}

void Link(int A, int B) {
    if (root.g[A] == 1 && root.g[B] == 1 && root.find_tata(A) == root.find_tata(B)) {
        ciclu.push_back(root.grad[root.find_tata(A)]);
    }

    e.push_back({A, B});
    root.link(A, B, 1);

    int old3 = trk.size();

    if (cen.size() == 0 && (root.g[A] >= 3 || root.g[B] >= 3)) {
        if (g3.size() > 4)
            return ;

        if (root.g[A] == 3) {
            g3.push_back(A);
            if (nuexista(A))
                trk.push_back(A);
            for (auto i : vec[A]) {
                if (g3.size() == 1)
                    trk.push_back(i);
            }

            invalideaza(A);
        }
        if (root.g[B] == 3) {
            g3.push_back(B);
            if (nuexista(B))
                trk.push_back(B);
            for (auto i : vec[B]) {
                if (g3.size() == 1)
                    trk.push_back(i);
            }

            invalideaza(B);
        }

        if (root.g[A] > 3) cen.push_back(A);
        if (root.g[B] > 3) cen.push_back(B);
    }

    if (centered == -1 && cen.size() == 1 && g3.size() <= 4) {
        for (int i = 0; i < g3.size(); ++ i) {
            if (g3[i] == cen[0])
                centered = i;
        }
    }

    // dc nu exista cen, at tin pentru cele 4 g3 uri cum arata fara fiecare
    if (cen.size() == 0) {
        if (g3.size() > 4)
            return ;

        for (int i = old3; i < (int)trk.size(); ++ i) {
            s3[i].init();

            for (auto j : e)
                if (j.first != trk[i] && j.second != trk[i])
                    s3[i].link(j.first, j.second);
        }

        for (int i = 0; i < old3; ++ i)
            if (A != trk[i] && B != trk[i])
                s3[i].link(A, B);
    }

    if (cen.size() == 1)
        if (A != cen[0] && B != cen[0])
            s3[centered].link(A, B);
}

int CountCritical() {
    if (ciclu.size() > 1 || cen.size() > 1) {
        return 0;
    }

    if (g3.size() == 0) {
        if (ciclu.size() == 0)
            return n;
        return ciclu[0];
    } else {
        if (cen.size() == 0 && g3.size() > 4) // daca sunt 4+ trebuie sa aiba un centru
            return 0;

        if (cen.size()) {
            return s3[centered].valid;
        } else {
            int cnt = 0;
            for (int i = 0; i < (int)trk.size(); ++ i) {
                cnt += s3[i].valid;
            }
            return cnt;
        }
    }
}

Compilation message

rings.cpp: In function 'void invalideaza(int)':
rings.cpp:78:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < trk.size(); ++ i) {
                     ~~^~~~~~~~~~~~
rings.cpp: In function 'void Link(int, int)':
rings.cpp:134:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int i = 0; i < g3.size(); ++ i) {
                         ~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 23800 KB Output is correct
2 Correct 28 ms 24440 KB Output is correct
3 Correct 28 ms 24552 KB Output is correct
4 Correct 25 ms 23936 KB Output is correct
5 Correct 26 ms 24056 KB Output is correct
6 Correct 28 ms 24192 KB Output is correct
7 Correct 24 ms 24448 KB Output is correct
8 Correct 29 ms 24028 KB Output is correct
9 Correct 33 ms 24568 KB Output is correct
10 Correct 27 ms 24576 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 595 ms 50852 KB Output is correct
2 Correct 1704 ms 102500 KB Output is correct
3 Correct 1427 ms 141268 KB Output is correct
4 Correct 1636 ms 75196 KB Output is correct
5 Correct 1554 ms 75092 KB Output is correct
6 Correct 1505 ms 73768 KB Output is correct
7 Correct 1250 ms 151888 KB Output is correct
8 Correct 2890 ms 115664 KB Output is correct
9 Correct 3365 ms 133684 KB Output is correct
10 Correct 1079 ms 72792 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 23800 KB Output is correct
2 Correct 28 ms 24440 KB Output is correct
3 Correct 28 ms 24552 KB Output is correct
4 Correct 25 ms 23936 KB Output is correct
5 Correct 26 ms 24056 KB Output is correct
6 Correct 28 ms 24192 KB Output is correct
7 Correct 24 ms 24448 KB Output is correct
8 Correct 29 ms 24028 KB Output is correct
9 Correct 33 ms 24568 KB Output is correct
10 Correct 27 ms 24576 KB Output is correct
11 Correct 28 ms 24448 KB Output is correct
12 Correct 33 ms 25336 KB Output is correct
13 Correct 33 ms 25080 KB Output is correct
14 Correct 29 ms 24832 KB Output is correct
15 Correct 50 ms 25208 KB Output is correct
16 Correct 34 ms 24444 KB Output is correct
17 Correct 32 ms 25472 KB Output is correct
18 Correct 33 ms 26488 KB Output is correct
19 Correct 28 ms 24576 KB Output is correct
20 Correct 30 ms 25256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 23800 KB Output is correct
2 Correct 28 ms 24440 KB Output is correct
3 Correct 28 ms 24552 KB Output is correct
4 Correct 25 ms 23936 KB Output is correct
5 Correct 26 ms 24056 KB Output is correct
6 Correct 28 ms 24192 KB Output is correct
7 Correct 24 ms 24448 KB Output is correct
8 Correct 29 ms 24028 KB Output is correct
9 Correct 33 ms 24568 KB Output is correct
10 Correct 27 ms 24576 KB Output is correct
11 Correct 28 ms 24448 KB Output is correct
12 Correct 33 ms 25336 KB Output is correct
13 Correct 33 ms 25080 KB Output is correct
14 Correct 29 ms 24832 KB Output is correct
15 Correct 50 ms 25208 KB Output is correct
16 Correct 34 ms 24444 KB Output is correct
17 Correct 32 ms 25472 KB Output is correct
18 Correct 33 ms 26488 KB Output is correct
19 Correct 28 ms 24576 KB Output is correct
20 Correct 30 ms 25256 KB Output is correct
21 Correct 56 ms 26144 KB Output is correct
22 Correct 64 ms 27248 KB Output is correct
23 Correct 83 ms 28272 KB Output is correct
24 Correct 88 ms 31188 KB Output is correct
25 Correct 47 ms 29560 KB Output is correct
26 Correct 99 ms 33004 KB Output is correct
27 Correct 93 ms 29288 KB Output is correct
28 Correct 96 ms 36840 KB Output is correct
29 Correct 98 ms 35900 KB Output is correct
30 Correct 157 ms 30052 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 23800 KB Output is correct
2 Correct 28 ms 24440 KB Output is correct
3 Correct 28 ms 24552 KB Output is correct
4 Correct 25 ms 23936 KB Output is correct
5 Correct 26 ms 24056 KB Output is correct
6 Correct 28 ms 24192 KB Output is correct
7 Correct 24 ms 24448 KB Output is correct
8 Correct 29 ms 24028 KB Output is correct
9 Correct 33 ms 24568 KB Output is correct
10 Correct 27 ms 24576 KB Output is correct
11 Correct 595 ms 50852 KB Output is correct
12 Correct 1704 ms 102500 KB Output is correct
13 Correct 1427 ms 141268 KB Output is correct
14 Correct 1636 ms 75196 KB Output is correct
15 Correct 1554 ms 75092 KB Output is correct
16 Correct 1505 ms 73768 KB Output is correct
17 Correct 1250 ms 151888 KB Output is correct
18 Correct 2890 ms 115664 KB Output is correct
19 Correct 3365 ms 133684 KB Output is correct
20 Correct 1079 ms 72792 KB Output is correct
21 Correct 28 ms 24448 KB Output is correct
22 Correct 33 ms 25336 KB Output is correct
23 Correct 33 ms 25080 KB Output is correct
24 Correct 29 ms 24832 KB Output is correct
25 Correct 50 ms 25208 KB Output is correct
26 Correct 34 ms 24444 KB Output is correct
27 Correct 32 ms 25472 KB Output is correct
28 Correct 33 ms 26488 KB Output is correct
29 Correct 28 ms 24576 KB Output is correct
30 Correct 30 ms 25256 KB Output is correct
31 Correct 56 ms 26144 KB Output is correct
32 Correct 64 ms 27248 KB Output is correct
33 Correct 83 ms 28272 KB Output is correct
34 Correct 88 ms 31188 KB Output is correct
35 Correct 47 ms 29560 KB Output is correct
36 Correct 99 ms 33004 KB Output is correct
37 Correct 93 ms 29288 KB Output is correct
38 Correct 96 ms 36840 KB Output is correct
39 Correct 98 ms 35900 KB Output is correct
40 Correct 157 ms 30052 KB Output is correct
41 Correct 317 ms 43356 KB Output is correct
42 Correct 1182 ms 99360 KB Output is correct
43 Correct 335 ms 76128 KB Output is correct
44 Correct 1075 ms 157896 KB Output is correct
45 Correct 1359 ms 117952 KB Output is correct
46 Correct 1193 ms 78040 KB Output is correct
47 Correct 1413 ms 79140 KB Output is correct
48 Correct 669 ms 143220 KB Output is correct
49 Correct 937 ms 77044 KB Output is correct
50 Correct 1056 ms 76736 KB Output is correct
51 Correct 396 ms 79152 KB Output is correct
52 Correct 782 ms 132056 KB Output is correct
53 Correct 710 ms 143836 KB Output is correct
54 Correct 2455 ms 123856 KB Output is correct
55 Correct 1676 ms 122460 KB Output is correct