Submission #1021244

#TimeUsernameProblemLanguageResultExecution timeMemory
1021244fv3자동 인형 (IOI18_doll)C++14
85.55 / 100
67 ms14472 KiB
#include <bits/stdc++.h>
#include "doll.h"

using namespace std;

vector<int> C;
vector<int> X, Y;
int lastSwitch = 0;
int INF = 1 << 30;

void make_connections(int cnt)
{
	int origo = -X.size() - 1;
	int index = 0;

	int nt = 1;
	while (nt < cnt)
		nt *= 2;

	vector<int> st(2 * nt), label(2 * nt);
	for (int i = 2 * nt - cnt; i < 2 * nt; i++)
		st[i] = 1;

	for (int i = nt - 1; i >= 1; i--)
		st[i] = max(st[i*2], st[i*2|1]);

	label[1] = --lastSwitch;
	for (int i = 1; i < nt; i++)
	{
		if (!st[i]) continue;

		if (st[i * 2])
		{
			if (i * 2 >= nt)
			{
				X.push_back(INF);
			}
			else
			{
				X.push_back(--lastSwitch);
				label[i*2] = lastSwitch;
			}
		}
		else
		{
			X.push_back(origo);
		}

		if ((2 * i | 1) >= nt)
		{
			Y.push_back(INF);
		}
		else
		{
			label[(2*i|1)] = --lastSwitch;
			Y.push_back(lastSwitch);
		}
	}
}

void simulate(vector<int> &A)
{
	int nxt = 0;
	int index = C[0];
	A.push_back(0);
	vector<int> state(X.size());

	while (index != 0)
	{
		if (index < 0)
		{
			if (!state[-index - 1])
			{
				state[-index-1] ^= 1;
				if (X[-index-1] == INF)
				{
					X[-index-1] = A[nxt];
				}

				index = X[-index-1];
			}
			else
			{
				state[-index-1] ^= 1;
				if (Y[-index-1] == INF)
					Y[-index-1] = A[nxt];

				index = Y[-index-1];
			}
		}
		else
		{
			index = C[index];
			nxt++;
		}
	}
}

void create_circuit(int M, vector<int> A) 
{
	vector<vector<int>> adj(M + 1);
	const int N = A.size();

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

	C = vector<int>(M + 1);
	
	for (int i = 0; i < M + 1; i++)
	{
		if (adj[i].size() > 1)
		{
			C[i] = -X.size() - 1;
			make_connections(adj[i].size());
		}
		else if (adj[i].size() == 1)
			C[i] = adj[i][0];
	}

	simulate(A);
	answer(C, X, Y);
}

Compilation message (stderr)

doll.cpp: In function 'void make_connections(int)':
doll.cpp:14:6: warning: unused variable 'index' [-Wunused-variable]
   14 |  int index = 0;
      |      ^~~~~
#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...