제출 #401270

#제출 시각아이디문제언어결과실행 시간메모리
401270idk321자동 인형 (IOI18_doll)C++11
0 / 100
403 ms36532 KiB
#include "doll.h"

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int m, n;
const int N = 100005;
vector<int> a;
vector<int> c;
vector<int> x;
vector<int> y;

array<int, 2> sAt[4 * N];
int used;

bool endNode[4 * N];
void solve(int ca, int cb, int node)
{

    if (ca == cb)
    {


        endNode[node] = true;
        return;
    }

    int mid = (ca + cb) / 2;
    array<int, 2> cur = {-node * 2, -node * 2 - 1};
    sAt[node] = cur;
    solve(ca, mid, node * 2);
    solve(mid + 1, cb, node * 2+  1);
}


void create_circuit(int M, std::vector<int> A) {
    m = M;
    a = A;
  n = A.size();

  std::vector<int> C(M + 1);
  C[0] = -1;


  c = C;
  for (int i = 1; i <= m; i++) c[i] = -1;
    c[0] = a[0];

  used = 1;
    solve(1, 131072, 1);

   int cur = 1;
   int endNodeNum = 1;
   vector<int> switched(4 * N);
   vector<int> freq(4 * N);
   while (true)
   {
        if (endNode[cur])
        {
            freq[cur]++;
            if (endNodeNum == 131072 * 2)
            {
                sAt[cur][1] = 0;
            } else
            {
                if (used < n)
                {
                    sAt[cur][switched[cur]] = a[used];
                    used++;
                    switched[cur] = (switched[cur] + 1) % 2;
                } else
                {
                    sAt[cur][switched[cur]] = -1;
                    used++;
                    switched[cur] = (switched[cur] + 1) % 2;
                }
            }

            if (endNodeNum == 131072 * 2) break;
            cur = 1;
            endNodeNum++;
        } else
        {
            int next = sAt[cur][switched[cur]] * (-1);
            switched[cur] = (switched[cur] + 1) % 2;
            cur = next;
        }
   }

  vector<int> x;
  vector<int> y;

  map<int, int> turnTo;
  set<int> nums;
  for (int i = 0; i < 4 *N; i++)
  {
        if (!(sAt[i][0] == 0 && sAt[i][1] == 0))
        {
            if (sAt[i][0] < 0) nums.insert(sAt[i][0]);
            if (sAt[i][1] < 0) nums.insert(sAt[i][1]);


        }
  }
  int cnum = -1;
  for (auto it = nums.rbegin(); it != nums.rend(); it++)
  {
    turnTo[*it] = cnum;
    cnum--;
  }

    for (int i = 0; i < 4 *N; i++)
  {
        if (!(sAt[i][0] == 0 && sAt[i][1] == 0))
        {
            if (sAt[i][0] < 0) x.push_back(turnTo[sAt[i][0]]);
            else x.push_back(sAt[i][0]);
            if (sAt[i][1] < 0) y.push_back(turnTo[sAt[i][1]]);
            else y.push_back(sAt[i][1]);
        }
  }




  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...