Submission #1225225

#TimeUsernameProblemLanguageResultExecution timeMemory
1225225thelegendary08Mechanical Doll (IOI18_doll)C++20
37 / 100
265 ms59768 KiB
#include "doll.h"
#include<bits/stdc++.h>
#define vi vector<int>
#define vb vector<bool>
#define pb push_back
#define vvi vector<vector<int>>
#define f0r(i,n) for(int i = 0; i<n; i++)
#define vout(v) for(auto u : v)cout<<u<<' '; cout<<'\n';
using namespace std;
void create_circuit(int M, std::vector<int> A) {
	vi v;
	v.pb(0);
	for(auto u : A)v.pb(u);
	v.pb(0);
	vvi nxt(M+1);
	f0r(i, v.size() - 1){
		nxt[v[i]].pb(v[i+1]);
	}
	int curnum = 0;
	vi c(M+1);
	vi x;
	vi y;
	f0r(t, M+1){
		if(nxt[t].size() >= 2){
			int mx = ceil(log2(nxt[t].size()));
			int bts = (1 << mx) - nxt[t].size();
			int num = -1;
			int ptr = 0;
			c[t] = curnum - 1;
			
			f0r(i, mx){
				f0r(j, (1 << i)){
					if(i != mx - 1){
						x.pb(curnum + num * 2);
						y.pb(curnum + num * 2 - 1);
					}
					else{
						int ind1;
						int nind = j*2;
						ind1 = 0;
						for(int k = mx-1; k>=0; k--){
							ind1 += (1 << (mx -1- k)) * (((1 << k) & nind) > 0);
						}
						//cout<<nind<<' '<<ind1<<'\n';
						int nind2 = j*2 + 1;
						int ind2 = 0;
						for(int k = mx; k>=0; k--){
							ind2 += (1 << (mx -1- k)) * (((1 << k) & nind2) > 0);
						}
						//cout<<nind2<<' '<<ind2<<'\n';
						if(ind1 >= bts){
							x.pb(nxt[t][ind1 - bts]);
						}
						else{
							x.pb(curnum - 1);
						}
						if(ind2 >= bts){
							y.pb(nxt[t][ind2 - bts]);
						}
						else{
							y.pb(curnum - 1);
						}
					}
					
					num--;
				}
			}
			curnum += num + 1;
		}
		else if(nxt[t].size() == 1){
			c[t] = nxt[t][0];
		}
	}
	// vout(c);
	// vout(x);
	// vout(y);
	map<int,vi>fr;
	f0r(i,c.size()){
		fr[c[i]].pb(i);
	}
	f0r(i, x.size()){
		fr[x[i]].pb(i);
	}
	map<int,int> ne;
	map<int,int> nx;
	vb tk(x.size());
	for(int i = x.size(); i>=0; i--){
		if(x[i] == 0 && y[i] == 0){
			tk[i] = 1;
			nx[i] = x[i];
		}
	}
	int cnt = 0;
	f0r(i,x.size()){
		if(!tk[i]){
			ne[i] = cnt;
			cnt++;
		}
	}
	f0r(i, c.size()){
		if(c[i] < 0){
			if(tk[-c[i] - 1]){
				c[i] = nx[-c[i] - 1];
			}
			else{
				c[i] = -ne[-c[i] - 1] - 1;
			}
		}
	}
	
	vi xx; vi yy;
	f0r(i, x.size()){
		pair<int,int> p;
		if(!tk[i]){
			if(x[i] < 0){
				if(tk[-x[i] - 1]){
					p.first = nx[-x[i] - 1];
				}
				else{
					p.first = -ne[-x[i] - 1] - 1;
				}
			}
			else p.first = x[i];
			
			if(y[i] < 0){
				if(tk[-y[i] - 1]){
					p.second = nx[-y[i] - 1];
				}
				else{
					p.second = -ne[-y[i] - 1] - 1;
				}
			}
			else p.second = y[i];
		}
		xx.pb(p.first);
		yy.pb(p.second);	
	}
	// vout(c);
	// vout(xx);
	// vout(yy);
	answer(c,xx,yy);
	
}
#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...