답안 #1016343

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1016343 2024-07-07T20:44:57 Z vjudge1 자동 인형 (IOI18_doll) C++17
53 / 100
91 ms 16712 KB
#include <bits/stdc++.h>
using namespace std;

enum {
    EXIT = 2000000,
};

void answer(vector<int> C, vector<int> X, vector<int> Y);

void create_circuit(int M, vector<int> A) {    
    int N = A.size();
    vector<int> C(M + 1);
    vector<int> X(4*N),Y(4*N);
    vector<vector<int>> nextoccurences(M+1);
    A.emplace_back(EXIT);
    for(int i=0;i<N;i++)nextoccurences[A[i]].emplace_back(A[i+1]);
    int S = 0;
    for(int i=1;i<=M;i++){
        if(nextoccurences[i].empty())continue;
        int siz = 1;
        while(nextoccurences[i].size()>siz)siz<<=1;
        if(nextoccurences[i].size()==siz)continue;
        while(nextoccurences[i].size()<siz-1)nextoccurences[i].emplace_back(-i);
        nextoccurences[i].emplace_back(0);
    }
    int extraneeded = 0;
    int head = -1;
    pair<bool,int> exitnode;
    function<void(int,vector<int>)> calc = [&](int x,vector<int> targets){
        if(targets.size()==2){
            if(targets[0]==EXIT){
                exitnode = {false,-x};
            } else if(targets[0]==0){
                X[x] = extraneeded;
                extraneeded = head;
            } else if(targets[0]<0){
                X[x] = head;
            } else {
                X[x] = targets[0];
            }
            if(targets[1]==EXIT){
                exitnode = {true,-x};
            } else if(targets[1]==0){
                Y[x] = extraneeded;
                extraneeded = head;
            } else if(targets[1]<0){
                Y[x] = head;
            } else {
                Y[x] = targets[1];
            }
        } else {
            vector<int> odds;
            vector<int> evens;
            for(int i=0;i<targets.size();i++)
                if(i&1)odds.emplace_back(targets[i]);
                else evens.emplace_back(targets[i]);
            X[x] = -(++S);
            calc(S,evens);
            Y[x] = -(++S);
            calc(S,odds);
        }
    };
    for(int i=1;i<=M;i++){
        if(nextoccurences[i].empty())continue;
        if(nextoccurences[i].size()==1){
            if(nextoccurences[i][0]==EXIT){
                exitnode = {false,i};
            } else {
                C[i] = nextoccurences[i][0];
            }
            continue;
        } 
        head = -(++S);
        C[i]=head;
        calc(-head,nextoccurences[i]);
    }
    if(exitnode.second>0){
        C[exitnode.second]=extraneeded;
    } else {
        if(!exitnode.first)X[-exitnode.second]=extraneeded;
        else Y[-exitnode.second]=extraneeded;
    }
    C[0] = A[0];
    X.erase(X.begin());
    Y.erase(Y.begin());
    X.resize(S);
    Y.resize(S);
    answer(C, X, Y);
}

Compilation message

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:21:39: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   21 |         while(nextoccurences[i].size()>siz)siz<<=1;
      |               ~~~~~~~~~~~~~~~~~~~~~~~~^~~~
doll.cpp:22:36: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   22 |         if(nextoccurences[i].size()==siz)continue;
      |            ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
doll.cpp:23:39: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   23 |         while(nextoccurences[i].size()<siz-1)nextoccurences[i].emplace_back(-i);
      |               ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
doll.cpp: In lambda function:
doll.cpp:54:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   54 |             for(int i=0;i<targets.size();i++)
      |                         ~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 15 ms 8384 KB Output is correct
3 Correct 14 ms 7256 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 6 ms 3932 KB Output is correct
6 Correct 19 ms 10956 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 15 ms 8384 KB Output is correct
3 Correct 14 ms 7256 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 6 ms 3932 KB Output is correct
6 Correct 19 ms 10956 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 27 ms 10840 KB Output is correct
9 Correct 31 ms 12372 KB Output is correct
10 Correct 47 ms 16448 KB Output is correct
11 Correct 0 ms 344 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 15 ms 8384 KB Output is correct
3 Correct 14 ms 7256 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 6 ms 3932 KB Output is correct
6 Correct 19 ms 10956 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 27 ms 10840 KB Output is correct
9 Correct 31 ms 12372 KB Output is correct
10 Correct 47 ms 16448 KB Output is correct
11 Correct 0 ms 344 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 344 KB Output is correct
14 Correct 63 ms 15680 KB Output is correct
15 Correct 32 ms 9304 KB Output is correct
16 Correct 54 ms 13892 KB Output is correct
17 Correct 0 ms 344 KB Output is correct
18 Correct 0 ms 344 KB Output is correct
19 Correct 0 ms 348 KB Output is correct
20 Correct 55 ms 16048 KB Output is correct
21 Correct 0 ms 344 KB Output is correct
22 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Partially correct 0 ms 344 KB Output is partially correct
2 Correct 36 ms 8668 KB Output is correct
3 Partially correct 73 ms 11512 KB Output is partially correct
4 Partially correct 68 ms 14404 KB Output is partially correct
# 결과 실행 시간 메모리 Grader output
1 Partially correct 0 ms 344 KB Output is partially correct
2 Correct 36 ms 8668 KB Output is correct
3 Partially correct 73 ms 11512 KB Output is partially correct
4 Partially correct 68 ms 14404 KB Output is partially correct
5 Partially correct 71 ms 16188 KB Output is partially correct
6 Partially correct 82 ms 16192 KB Output is partially correct
7 Partially correct 76 ms 16192 KB Output is partially correct
8 Partially correct 82 ms 16196 KB Output is partially correct
9 Partially correct 65 ms 11600 KB Output is partially correct
10 Partially correct 84 ms 16712 KB Output is partially correct
11 Partially correct 91 ms 16196 KB Output is partially correct
12 Partially correct 68 ms 10832 KB Output is partially correct
13 Partially correct 50 ms 10836 KB Output is partially correct
14 Partially correct 51 ms 10576 KB Output is partially correct
15 Partially correct 43 ms 10836 KB Output is partially correct
16 Partially correct 1 ms 604 KB Output is partially correct
17 Partially correct 47 ms 9616 KB Output is partially correct
18 Partially correct 49 ms 9556 KB Output is partially correct
19 Partially correct 51 ms 9816 KB Output is partially correct
20 Partially correct 79 ms 13780 KB Output is partially correct
21 Partially correct 79 ms 14916 KB Output is partially correct
22 Partially correct 57 ms 13376 KB Output is partially correct