답안 #1041071

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1041071 2024-08-01T14:52:22 Z jer033 낙하산 고리들 (IOI12_rings) C++17
52 / 100
1344 ms 262144 KB
#include <bits/stdc++.h>
using namespace std;

int N;
int curr_answer;
bool second_stage;

class LinkedIn{
public:
    vector<vector<int>> edges;
    vector<int> chains;
    //value encoded: other endpoint of chain (itself if 0 connections), or -1 if it has 2 connections
    vector<int> degree;
    int cycle_count;
    int cycle_size;
    bool three_exists;

    LinkedIn(int N_)
    {
        edges = vector<vector<int>> (N_);
        chains = vector<int> (N_);
        for (int i=0; i<N_; i++)
            chains[i] = i;
        degree = vector<int> (N_, 0);
        
        cycle_count = 0;
        cycle_size = 0;
        three_exists = 0;
    };

    int CreateLink(int A, int B)
    {
        degree[A]++;
        degree[B]++;
        
        if ((chains[A]>=0) and (chains[B]>=0))
        {
            if ((chains[A]==B) and (chains[B]==A))
            {
                cycle_count++;
                cycle_count = min(cycle_count, 2);
                if (cycle_count == 1)
                {
                    vector<int> visited(N, 0);
                    visited[A] = 1;
                    int curr = A;
                    cycle_size = 1;
                    while (curr!=B)
                    {
                        int next_node;
                        for (int c: edges[curr])
                            if (visited[c]==0)
                                next_node = c;
                        visited[next_node] = 1;
                        curr = next_node;
                        cycle_size++;
                    }
                    //cout << "A cycle of size " << cycle_size << " has been formed\n";
                }
                chains[A] = -1;
                chains[B] = -1;
            }
            else
            {
                int newchainsA, newchainsB;
                int newchains2A, newchains2B;
                if (chains[A]==A)
                    newchainsA = chains[B];
                else
                {
                    newchains2A = chains[B];
                    newchainsA = -1;
                }
                if (chains[B]==B)
                    newchainsB = chains[A];
                else
                {
                    newchains2B = chains[A];
                    newchainsB = -1;
                }

                if (chains[A]==A)
                    chains[A] = newchainsA;
                else
                {
                    chains[chains[A]] = newchains2A;
                    chains[A] = newchainsA;
                }

                if (chains[B]==B)
                    chains[B] = newchainsB;
                else
                {
                    chains[chains[B]] = newchains2B;
                    chains[B] = newchainsB;
                }
            }
        }
        else{
            three_exists = 1;
        }

        edges[A].push_back(B);
        edges[B].push_back(A);

        if (degree[A]>=3)
            three_exists = 1;
        if (degree[B]>=3)
            three_exists = 1;

        /*for (int i=0; i<N; i++)
            cout << chains[i] << ' ';
        cout << '\n';*/

        if (three_exists)
            return 3;
        else if (cycle_count > 0)
            return min(cycle_count, 2);
        return 0;
    };

    int answer()
    {
        if (cycle_count>=2)
            return 0;
        if (cycle_count==1)
            return cycle_size;
        return N;
    }

    int answer_2()
    {
        if (three_exists)
            return 0;
        if (cycle_count >= 1)
            return 0;
        return 1;
    }
};

int c1, c2, c3, c4;
LinkedIn sys_0(0);
LinkedIn sys_1(0);
LinkedIn sys_2(0);
LinkedIn sys_3(0);
LinkedIn sys_4(0);

void Init(int N_) {
    N = N_;
    curr_answer = N_;
    sys_0 = LinkedIn(N_);
    second_stage = 0;
}

void Link(int A, int B) {
    if (second_stage == 0)
    {
        int result = sys_0.CreateLink(A, B);
        if (result != 3)
        {
            curr_answer = sys_0.answer();
        }
        else
        {
            second_stage = 1;
            vector<vector<int>> con = sys_0.edges;
            vector<int> deg = sys_0.degree;
            int center;
            if (deg[A] == 3)
                center = A;
            else
                center = B;
            c1 = center;
            c2 = con[center][0];
            c3 = con[center][1];
            c4 = con[center][2];
            sys_1 = LinkedIn(N);
            sys_2 = LinkedIn(N);
            sys_3 = LinkedIn(N);
            sys_4 = LinkedIn(N);
            //cout << c1 << c2 << c3 << c4 << '\n';
            for (int i=0; i<N; i++)
                for (int j: con[i])
                    if (i<j)
                    {
                        if ((i!=c1) and (j!=c1))
                            int x = sys_1.CreateLink(i, j);
                        if ((i!=c2) and (j!=c2))
                            int x = sys_2.CreateLink(i, j);
                        if ((i!=c3) and (j!=c3))
                            int x = sys_3.CreateLink(i, j);
                        if ((i!=c4) and (j!=c4))
                            int x = sys_4.CreateLink(i, j);
                    }
            curr_answer = sys_1.answer_2() + sys_2.answer_2() + sys_3.answer_2() + sys_4.answer_2();
        }
    }
    else
    {
        int i = A;
        int j = B;
        if ((i!=c1) and (j!=c1))
            int x = sys_1.CreateLink(i, j);
        if ((i!=c2) and (j!=c2))
            int x = sys_2.CreateLink(i, j);
        if ((i!=c3) and (j!=c3))
            int x = sys_3.CreateLink(i, j);
        if ((i!=c4) and (j!=c4))
            int x = sys_4.CreateLink(i, j);
                    
        curr_answer = sys_1.answer_2() + sys_2.answer_2() + sys_3.answer_2() + sys_4.answer_2();
    }
}

int CountCritical() {
    return curr_answer;
}

/*int main()
{
    int en, L;
    cin >> en >> L;
    Init(en);
    while (L--)
    {
        int command;
        cin >> command;
        if (command == -1)
        {
            cout << CountCritical() << '\n';
        }
        else
        {
            int A = command;
            int B; cin >> B;
            Link(A, B);
        }
    }
}*/

Compilation message

rings.cpp: In function 'void Link(int, int)':
rings.cpp:187:33: warning: unused variable 'x' [-Wunused-variable]
  187 |                             int x = sys_1.CreateLink(i, j);
      |                                 ^
rings.cpp:189:33: warning: unused variable 'x' [-Wunused-variable]
  189 |                             int x = sys_2.CreateLink(i, j);
      |                                 ^
rings.cpp:191:33: warning: unused variable 'x' [-Wunused-variable]
  191 |                             int x = sys_3.CreateLink(i, j);
      |                                 ^
rings.cpp:193:33: warning: unused variable 'x' [-Wunused-variable]
  193 |                             int x = sys_4.CreateLink(i, j);
      |                                 ^
rings.cpp:203:17: warning: unused variable 'x' [-Wunused-variable]
  203 |             int x = sys_1.CreateLink(i, j);
      |                 ^
rings.cpp:205:17: warning: unused variable 'x' [-Wunused-variable]
  205 |             int x = sys_2.CreateLink(i, j);
      |                 ^
rings.cpp:207:17: warning: unused variable 'x' [-Wunused-variable]
  207 |             int x = sys_3.CreateLink(i, j);
      |                 ^
rings.cpp:209:17: warning: unused variable 'x' [-Wunused-variable]
  209 |             int x = sys_4.CreateLink(i, j);
      |                 ^
rings.cpp: In member function 'int LinkedIn::CreateLink(int, int)':
rings.cpp:94:39: warning: 'newchains2B' may be used uninitialized in this function [-Wmaybe-uninitialized]
   94 |                     chains[chains[B]] = newchains2B;
rings.cpp:54:42: warning: 'next_node' may be used uninitialized in this function [-Wmaybe-uninitialized]
   54 |                         visited[next_node] = 1;
      |                                          ^
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 3 ms 1628 KB Output is correct
3 Correct 3 ms 1768 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 1 ms 860 KB Output is correct
7 Correct 1 ms 1372 KB Output is correct
8 Correct 1 ms 604 KB Output is correct
9 Correct 3 ms 1884 KB Output is correct
10 Correct 3 ms 1884 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 137 ms 32848 KB Output is correct
2 Correct 1344 ms 250196 KB Output is correct
3 Runtime error 1144 ms 262144 KB Execution killed with signal 9
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 3 ms 1628 KB Output is correct
3 Correct 3 ms 1768 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 1 ms 860 KB Output is correct
7 Correct 1 ms 1372 KB Output is correct
8 Correct 1 ms 604 KB Output is correct
9 Correct 3 ms 1884 KB Output is correct
10 Correct 3 ms 1884 KB Output is correct
11 Correct 3 ms 1884 KB Output is correct
12 Correct 8 ms 4188 KB Output is correct
13 Correct 6 ms 3440 KB Output is correct
14 Correct 4 ms 2672 KB Output is correct
15 Correct 4 ms 4188 KB Output is correct
16 Correct 2 ms 1116 KB Output is correct
17 Correct 5 ms 3364 KB Output is correct
18 Correct 9 ms 5252 KB Output is correct
19 Correct 3 ms 1372 KB Output is correct
20 Correct 7 ms 3756 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 3 ms 1628 KB Output is correct
3 Correct 3 ms 1768 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 1 ms 860 KB Output is correct
7 Correct 1 ms 1372 KB Output is correct
8 Correct 1 ms 604 KB Output is correct
9 Correct 3 ms 1884 KB Output is correct
10 Correct 3 ms 1884 KB Output is correct
11 Correct 3 ms 1884 KB Output is correct
12 Correct 8 ms 4188 KB Output is correct
13 Correct 6 ms 3440 KB Output is correct
14 Correct 4 ms 2672 KB Output is correct
15 Correct 4 ms 4188 KB Output is correct
16 Correct 2 ms 1116 KB Output is correct
17 Correct 5 ms 3364 KB Output is correct
18 Correct 9 ms 5252 KB Output is correct
19 Correct 3 ms 1372 KB Output is correct
20 Correct 7 ms 3756 KB Output is correct
21 Correct 9 ms 3416 KB Output is correct
22 Correct 14 ms 4956 KB Output is correct
23 Correct 17 ms 6236 KB Output is correct
24 Correct 47 ms 21436 KB Output is correct
25 Correct 16 ms 18780 KB Output is correct
26 Correct 47 ms 24524 KB Output is correct
27 Correct 19 ms 6692 KB Output is correct
28 Correct 74 ms 26336 KB Output is correct
29 Correct 47 ms 22696 KB Output is correct
30 Correct 24 ms 8020 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 3 ms 1628 KB Output is correct
3 Correct 3 ms 1768 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 1 ms 860 KB Output is correct
7 Correct 1 ms 1372 KB Output is correct
8 Correct 1 ms 604 KB Output is correct
9 Correct 3 ms 1884 KB Output is correct
10 Correct 3 ms 1884 KB Output is correct
11 Correct 137 ms 32848 KB Output is correct
12 Correct 1344 ms 250196 KB Output is correct
13 Runtime error 1144 ms 262144 KB Execution killed with signal 9
14 Halted 0 ms 0 KB -