제출 #1244760

#제출 시각아이디문제언어결과실행 시간메모리
1244760lncreedible자동 인형 (IOI18_doll)C++20
0 / 100
97 ms18244 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;

void create_circuit(int M, vector<int> A) {
    int N = A.size();
    vector<vector<int>> occ(M + 1);
    for (int i = 0; i < N; ++i) occ[A[i]].push_back(i);

    vector<int> C(M + 1, 0);
    vector<int> X, Y;

    int sw_id = 1;
    map<int, int> head, tail;

    for (int t = 1; t <= M; ++t) {
        head[t] = sw_id++;
        tail[t] = head[t];
    }

    for (int t = 1; t <= M; ++t) {
        int sz = occ[t].size();
        for (int i = 2; i < sz; ++i) {
            int new_sw = sw_id++;
            tail[t] = new_sw;
        }
    }

    X.resize(sw_id);
    Y.resize(sw_id);

    C[0] = A[0];
    for (int t = 1; t <= M; ++t) {
        C[t] = -head[t];
    }

    for (int t = 1; t <= M; ++t) {
        auto& pos = occ[t];
        int sz = pos.size();
        if (sz == 0) continue;
        int cur = head[t];

        for (int i = 0; i < sz; ++i) {
            int nxt = (i + 1 < sz) ? -(head[t] + i + 1) : (pos[i] + 1 < N ? A[pos[i] + 1] : 0);
            X[cur] = -cur;
            Y[cur] = nxt;
            if (nxt < 0) cur = -nxt;
        }
    }

    for (int t = 1; t <= M; ++t) {
        int s = tail[t];
        if (!X[s]) X[s] = -s;
        if (!Y[s]) Y[s] = 0;
    }

    X.erase(X.begin());
    Y.erase(Y.begin());
    answer(C, X, Y);
}
#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...