Submission #294901

#TimeUsernameProblemLanguageResultExecution timeMemory
294901kshitij_sodaniMechanical Doll (IOI18_doll)C++14
16 / 100
124 ms15672 KiB
#include <bits/stdc++.h>
using namespace std;
#define a first
#define b second
#define pb push_back
#define mp make_pair
typedef long long llo;

#include "doll.h"
vector<int> pre[100001];
//vector<int> adj[100001];
vector<int> ac;
vector<int> x;
vector<int> y;
int cur=0;
int cot;
pair<int,int> adj[1000001];
int stt[1000001];
void con(int ind,int tot,int dd){
	x.pb(0);
	y.pb(0);
	if(ind==tot-1){
		/*x.pb(0);
		y.pb(0);*/
	}
	else{
		adj[-dd]={-cur+1,-cur+2};
		x[-dd-1]=cur-1;
		y[-dd-1]=cur-2;
		cur--;
		cur--;
		int ba=cur;
		con(ind+1,tot,cur+1);
		con(ind+1,tot,ba);
	}
}
void create_circuit(int m, vector<int> aa) {
	int n=aa.size();
	
	for(int i=0;i<=m;i++){
		ac.pb(0);
	}
	ac[0]=aa[0];
	for(int i=0;i<aa.size()-1;i++){
		pre[aa[i]].pb(aa[i+1]);
	}
	pre[aa.back()].pb(0);
	
	for(int i=1;i<=m;i++){
		cot=i;
		if(pre[i].size()==0){
			continue;
		}
		if(pre[i].size()==1){
			ac[i]=pre[i][0];
		}
		else{
			int xx=pre[i].size();
			int dep=0;
			for(int j=0;j<=19;j++){
				if((1<<j)>=xx){
					dep=j;
					break;
				}
			}
		//	cout<<dep<<endl;
			cur--;
			ac[i]=cur;

			con(0,dep,cur);
			int op=(1<<dep);
			int ind2=0;
			for(int j=0;j<(1<<dep);j++){
				int st=-ac[i];
				//cout<<j<<",,"<<endl;
				for(int jj=0;jj<dep-1;jj++){
					if(stt[st]==0){
						stt[st]=1-stt[st];
						st=adj[st].a;
					}
					else{
						stt[st]=1-stt[st];
						st=adj[st].b;
					}
					
				}
				op--;
			//	cout<<j<<":"<<st<<endl;
				if(op<pre[i].size()){
					//cout<<stt[st]<<",,"<<pre[i][ind2]<<endl;
					if(stt[st]==0){
						x[st-1]=pre[i][ind2];
					}
					else{
						y[st-1]=pre[i][ind2];
					}
					stt[st]=1-stt[st];
					ind2++;
				}
				else{
					if(stt[st]==0){
						x[st-1]=ac[i];
					}
					else{
						y[st-1]=ac[i];
					}
					stt[st]=1-stt[st];
				}
			}
		}
		/*else if(pre[i].size()==2){
			cur--;
			ac[i]=cur;
			x.pb(pre[i][0]);
			y.pb(pre[i][1]);
		}
		else if(pre[i].size()==3){
			cur--;
			ac[i]=cur;
			x.pb(cur-1);
			y.pb(cur-2);
			cur--;
			x.pb(pre[i][0]);
			y.pb(cur+1);
			cur--;
			x.pb(pre[i][1]);
			y.pb(pre[i][2]);
		}
		else if(pre[i].size()==4){
			cur--;
			ac[i]=cur;
			x.pb(cur-1);
			y.pb(cur-2);
			cur--;
			x.pb(pre[i][0]);
			y.pb(pre[i][2]);
			cur--;
			x.pb(pre[i][1]);
			y.pb(pre[i][3]);
		}*/
	}
	if(x.size()>2*n){
		while(true){
			continue;
		}
	}
	/*for(auto j:ac){
		cout<<j<<",";
	}
	cout<<endl;
	for(auto j:x){
		cout<<j<<",";
	}
	cout<<endl;
	for(auto j:y){
		cout<<j<<",";
	}
	cout<<endl;*/

	answer(ac,x,y);









}

Compilation message (stderr)

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:44:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |  for(int i=0;i<aa.size()-1;i++){
      |              ~^~~~~~~~~~~~
doll.cpp:89:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |     if(op<pre[i].size()){
      |        ~~^~~~~~~~~~~~~~
doll.cpp:142:13: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  142 |  if(x.size()>2*n){
      |     ~~~~~~~~^~~~
#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...