Submission #140263

#TimeUsernameProblemLanguageResultExecution timeMemory
140263bazsi700Mechanical Doll (IOI18_doll)C++14
100 / 100
149 ms12196 KiB
#include <bits/stdc++.h> #include "doll.h" using namespace std; #define MOD 1000000007 #define ll long long int #define vi vector<int> #define vii vector< vector<int> > #define PI 3.1415926535897932384626433832795 #define INF 9223372036854775807LL #define hashA 1257958787 #define hashB 1539500609 #define endl "\n" vector<pair<int,int> > getorder(int cn) { //cout << "a" << endl; vector<pair<int,int> > ord; ord.push_back({0,0}); cn/=2; while(cn) { int n = ord.size(); //cout << n << endl; for(int i = 0; i < n; i++) { ord.push_back({ord[i].first+cn,0}); } //cout << cn << endl; cn/=2; } cn = ord.size(); for(int i = 0; i < cn; i++) { ord.push_back({ord[i].first,1}); } return ord; } int onpos[20][270000]; void create_circuit(int m, std::vector<int> A) { vector<int> C(m+1,-1); int n = A.size(); int cn = 1; int ends = 1; int layers = 1; while(2*ends < n+1) { cn*=2; cn++; ends*= 2; layers++; } onpos[0][0] = 1; vector<int> canget(25); canget[0] = ends*2; for(int i = 1; i < 25; i++) { canget[i] = canget[i-1]/2; } set<pair<int,pair<int,int> > > tobuild; tobuild.insert({0,{0,n+1}}); int currind = 1; while(!tobuild.empty()) { auto it = tobuild.begin(); auto nod = *it; tobuild.erase(it); int lay = nod.first; int pos = nod.second.first; int want = nod.second.second; onpos[lay][pos] = currind++; if(lay == layers-1) { continue; } if(canget[lay+1] >= want) { tobuild.insert({lay+1,{pos*2+1,want}}); } else { tobuild.insert({lay+1,{pos*2,canget[lay+1]}}); tobuild.insert({lay+1,{pos*2+1,want-canget[lay+1]}}); } } vector<int> X (currind-1); vector<int> Y (currind-1); for(int lay = 0; lay < layers-1; lay++) { for(int i = 0; i < (1<<lay); i++) { if(onpos[lay][i]) { // cout << lay << " " << i << " " << onpos[lay][i] << " " << onpos[lay+1][i*2] << " " << onpos[lay+1][i*2+1] << endl; if(onpos[lay+1][i*2]) { X[onpos[lay][i]-1] = -onpos[lay+1][i*2]; } else { X[onpos[lay][i]-1] = -1; } if(onpos[lay+1][i*2+1]) { Y[onpos[lay][i]-1] = -onpos[lay+1][i*2+1]; } else { Y[onpos[lay][i]-1] = -1; } } } } /*for(int i = 0; (i+1)*2 < cn; i++) { X[i] = -(i*2+2); Y[i] = -(i*2+3); }*/ int ind = 0; //for(int i = 0; i < currind-1; i++) { // cout << X[i] << " " << Y[i] << endl; //} //cout << "a" << endl; vector<pair<int,int> > ord = getorder(ends); //cout << ends << " " << ord.size() << endl; int lst = -1; for(int i = 0; i < 2*ends; i++) { if(onpos[layers-1][ord[i].first]) { //cout << ord[i].first << " "; //cout << onpos[layers-1][ord[i].first] << endl; if(ord[i].second == 0) { if(ind < n) { X[onpos[layers-1][ord[i].first]-1] = A[ind++]; } else { X[onpos[layers-1][ord[i].first]-1] = -1; } } else { if(ind < n) { Y[onpos[layers-1][ord[i].first]-1] = A[ind++]; } else { Y[onpos[layers-1][ord[i].first]-1] = -1; } } lst = onpos[layers-1][ord[i].first]-1; } } Y[lst] = 0; /*cout << "b" << endl; for(int i = 0; i < currind-1; i++) { cout << X[i] << " " << Y[i] << endl; }*/ 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...