Submission #287805

#TimeUsernameProblemLanguageResultExecution timeMemory
287805AlanChenMechanical Doll (IOI18_doll)C++14
100 / 100
186 ms10292 KiB
#include "doll.h"

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

template<class A> using v=vector<A>;

typedef v<int> vi;

#define sz(S) (int)(S).size()
#define pb push_back



#define get4(a,b,c,d,...) d

#define lp3(x,a,b) for(int x=(a);x<(b);x++)
#define lp2(x,a) lp3(x,0,a)
#define lp1(a) lp2(loopvar,a)
#define lp(x...) get4(x,lp3,lp2,lp1,0)(x)


#define trv(x,S) for(auto& x:(S))


const int mx=800100;
int n,m,bn,s,ful;

int tgt[mx];
int out[2][mx];

bool state[mx];

int makenet(int dpt)
{
	if(dpt==0) return 0;
	int ts=s;
	s++;
	out[0][ts]=makenet(dpt-1);
	out[1][ts]=makenet(dpt-1);
	return -ts;
}

void explore(int v,int p)
{
	if(v==0)
	{
		out[!state[p]][p]=tgt[ful],ful++;
		return;
	}
	state[v]=!state[v];
	explore(-out[!state[v]][v],v);
}

void create_circuit(int M, vi A)
{
	m=M;
	n=sz(A);
	lp(i,n) tgt[i]=A[i];

	vi bita;
	{
		int i1=n;
		while(i1>0) bita.pb(i1%2),i1/=2;
	}
	bn=sz(bita);


	lp(i,1,bn) out[1][i]=-(i+1);
	out[1][bn]=0;

	s=bn+1;
	lp(i,1,bn+1) out[0][i]=bita[bn-i]?makenet(bn-i):-1;

	lp(i,1,s+1) state[i]=0;
	ful=0;
	lp(n) explore(1,-1);


	vi C(m+1);
	lp(i,m+1) C[i]=-1;

	vi X,Y;

	lp(i,1,s) X.pb(out[0][i]);
	lp(i,1,s) Y.pb(out[1][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...