제출 #612201

#제출 시각아이디문제언어결과실행 시간메모리
612201JomnoiMechanical Doll (IOI18_doll)C++17
15 / 100
91 ms25728 KiB
#include <bits/stdc++.h>
#include "doll.h"
using namespace std;

const int MAX_M = 1e5 + 5;
const int INF = 1e9 + 7;

int N, M, S;
vector <int> nxt[MAX_M];
vector<int> C, X, Y;
vector <int> leaf;
vector <int> pattern[20];

void build(int u, int d) {
    if(d == 0) {
        return;
    }

    X[u - 1] = -(++S);
    if(d == 1) {
        leaf.push_back(S - 1);
    }
    build(S, d - 1);

    Y[u - 1] = -(++S);
    if(d == 1) {
        leaf.push_back(S - 1);
    }
    build(S, d - 1);
}

void create_circuit(int m, vector <int> A) {
    N = A.size(), M = m;
    C.resize(M + 1);
    X.resize(1e6, INF);
    Y.resize(1e6, INF);

    pattern[0].push_back(0);
    for(int j = 1; j < 20; j++) {
        pattern[j].resize(pattern[j - 1].size() * 2);
        for(int i = 0; i < pattern[j - 1].size(); i++) {
            pattern[j][i * 2] = pattern[j - 1][i];
        }
        for(int i = 0; i < pattern[j].size(); i += 2) {
            pattern[j][i + 1] = pattern[j][i] + (1<<(j - 1));
        }
    }

    A.push_back(0);
    for(int i = 0; i < N; i++) {
        nxt[A[i]].push_back(A[i + 1]);
    }

    C[0] = A[0];
    for(int a = 1; a <= M; a++) {
        if(nxt[a].empty()) {
            continue;
        }
        else if(nxt[a].size() == 1) {
            C[a] = nxt[a][0];
        }
        else {
            leaf.clear();
            int root = ++S;
            C[a] = -S;
            
            int numberofLevel = ceil(1.0 * log2(nxt[a].size()));
            build(S, numberofLevel - 1);
            if(numberofLevel == 1) {
                leaf.push_back(root - 1);
            }

            for(int i = 0; i < (1<<numberofLevel); i += 2) {
                int idx = pattern[numberofLevel][i];
                if(idx + 1 >= nxt[a].size()) {
                    X[leaf[i / 2]] = -root;
                }
                else {
                    X[leaf[i / 2]] = nxt[a][idx];
                }
            }
            for(int i = 1; i < (1<<numberofLevel); i += 2) {
                int idx = pattern[numberofLevel][i];
                if(idx + 1 >= nxt[a].size() and i != (1<<numberofLevel) - 1) {
                    Y[leaf[i / 2]] = -root;
                }
                else {
                    Y[leaf[i / 2]] = nxt[a][idx];
                }
            }
        }
    }

    while(X.back() == INF) {
        X.pop_back();
    }
    while(Y.back() == INF) {
        Y.pop_back();
    }
    answer(C, X, Y);
}

컴파일 시 표준 에러 (stderr) 메시지

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:41:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |         for(int i = 0; i < pattern[j - 1].size(); i++) {
      |                        ~~^~~~~~~~~~~~~~~~~~~~~~~
doll.cpp:44:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |         for(int i = 0; i < pattern[j].size(); i += 2) {
      |                        ~~^~~~~~~~~~~~~~~~~~~
doll.cpp:75:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |                 if(idx + 1 >= nxt[a].size()) {
      |                    ~~~~~~~~^~~~~~~~~~~~~~~~
doll.cpp:84:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   84 |                 if(idx + 1 >= nxt[a].size() and i != (1<<numberofLevel) - 1) {
      |                    ~~~~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...