제출 #299697

#제출 시각아이디문제언어결과실행 시간메모리
299697Dremix10자동 인형 (IOI18_doll)C++17
6 / 100
88 ms7376 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
#define F first
#define S second
#define endl '\n'
#define all(x) (x).begin(),(x).end()
const ll INF = 1e18;
const int N = 3e5+1;


void create_circuit(int m, vector<int> a) {
    int n = a.size();
    /// each trigger can only go to one place
    /// so in the case of {1,2,1} 1 can't go to 2 because
    /// the second time we get to 1 we will go to 2 which
    /// shouldn't happen

    int i,s = 1;
    vector<int> ans(m+1);
    vector<int> x,y;

    int cnt[m+1]={};

    for(auto x : a)
        cnt[x]++;
    int now[m+1]={};

    ans[0] = a[0];
    a.push_back(0);

    /// build circuit /*
    for(i=0;i<n;i++){
        int curr = a[i];
        if(cnt[curr]==1){
            ans[curr] = a[i+1];
        }
        else if(cnt[curr]==2){
            if(!now[curr]){
                ans[curr] = -s;
                s++;
                x.push_back(a[i+1]);
                y.push_back(0);
                now[curr]++;
            }
            else{
                y[-ans[curr]-1] = a[i+1];
                now[curr]++;
            }
        }
        else if(cnt[curr]==3){
            if(!now[curr]){
                ans[curr] = -s;

                /// creating and directing first switch
                s++;
                x.push_back(-s);
                s++;
                y.push_back(-s);
                s++;

                /// configure second switch
                x.push_back(a[i+1]);
                y.push_back(-s+1);

                /// prep third switch
                x.push_back(-1);
                y.push_back(-1);

                now[curr]++;
            }
            else if(now[curr]==1){
                int idx = y[-ans[curr]-1];

                /// configure half third switch
                x[idx] = ans[i+1];

                now[curr]++;
            }
            else{
                int idx = y[-ans[curr]-1];

                /// configure other half third switch
                y[idx] = ans[i+1];

                now[curr]++;
            }
        }
        else{
            if(!now[curr]){
                ans[curr] = -s;

                /// creating and directing first switch
                s++;
                x.push_back(-s);
                s++;
                y.push_back(-s);
                s++;

                /// configure half second switch + prep other
                x.push_back(a[i+1]);
                y.push_back(-1);

                /// prep third switch
                x.push_back(-1);
                y.push_back(-1);

                now[curr]++;
            }
            else if(now[curr]==1){
                int idx = y[-ans[curr]-1];

                /// configure half third switch
                x[idx] = ans[i+1];

                now[curr]++;
            }
            else if(now[curr]==2){
                int idx = x[-ans[curr]-1];

                /// configure other half second switch
                y[idx] = ans[i+1];

                now[curr]++;
            }
            else{
                int idx = y[-ans[curr]-1];

                /// configure other half third switch
                y[idx] = ans[i+1];

                now[curr]++;
            }
        }
    }
    /// build circuit */

    for(i=1;i<=m;i++)
        if(!cnt[i])ans[i] = i;
    answer(ans,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...