제출 #1333073

#제출 시각아이디문제언어결과실행 시간메모리
1333073activedeltorre자동 인형 (IOI18_doll)C++20
53 / 100
85 ms16400 KiB
#include "doll.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
using namespace std;
void answer(std::vector<int> C, std::vector<int> X, std::vector<int> Y);
int switches=0;
vector<int>copii[400005];
int out[400005];
int fiu1[400005];
int fiu2[400005];
void solve(int node,int sz,int truesz,vector<int>vec)
{
    if(sz==2)
    {
        fiu1[-node]=vec[0];
        fiu2[-node]=vec[1];
        return ;
    }
    int mij=(sz)/2;
    vector<int>st;
    vector<int>dr;
    for(int i=0;i<vec.size();i++)
    {
        if(i%2==0)
        {
            st.push_back(vec[i]);
        }
        else
        {
            dr.push_back(vec[i]);
        }
    }
    switches++;
    fiu1[-node]=-switches;
    switches++;
    fiu2[-node]=-switches;
    solve(fiu1[-node],mij,truesz,st);
    solve(fiu2[-node],mij,truesz,dr);
}
void make(int poz)
{
    if(copii[poz].size()==0)
    {
        out[poz]=0;
        return;
    }
    else if(copii[poz].size()==1)
    {
        out[poz]=copii[poz][0];
        return;
    }
    else
    {
        switches++;
        out[poz]=-switches;
        int adev=copii[poz].size();
        reverse(copii[poz].begin(),copii[poz].end());
        while(__builtin_popcount(copii[poz].size())!=1)
        {
            copii[poz].push_back(out[poz]);
        }
        reverse(copii[poz].begin(),copii[poz].end());
        solve(out[poz],copii[poz].size(),adev,copii[poz]);
    }
}
void create_circuit(int M, std::vector<int> A) {
  int N = A.size();
  copii[0].push_back(A[0]);
  for(int i=0;i+1<N;i++)
  {
    copii[A[i]].push_back(A[i+1]);
  }
  copii[A[N-1]].push_back(0);
  vector<int>C,X,Y;
  for(int i=0;i<=M;i++)
  {
    make(i);
    C.push_back(out[i]);
  }
  for(int i=1;i<=switches;i++)
  {
    X.push_back(fiu1[i]);
    Y.push_back(fiu2[i]);
  }
  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...