Submission #298733

#TimeUsernameProblemLanguageResultExecution timeMemory
298733inbarinMechanical Doll (IOI18_doll)C++14
100 / 100
112 ms10808 KiB
#include "doll.h"
#include <iostream>
#include <vector>
using namespace std;
#define fort(s,e) for(int i = s; i < e; i++)

//void answer(vector<int>a,vector<int>b,vector<int>c);

void create_circuit(int m, vector<int> a){
	int asc = a.size();
	a.push_back(0);
	vector<int>trig(m+1);
	vector<int>xx,yy;
	fort(0,m+1){
		trig[i] = -1;
	}
	int asp = 1;
	vector<int>dec;
	int jl = 0;
	while(asc){
		jl++;
		asp*=2;
		dec.push_back(asc%2);
		asc/=2;
	}
	asc = a.size();
	for(int i = 0; i < asp/2-1;i++){
		xx.push_back(-(i+1)*2);
		yy.push_back(-(i+1)*2-1);
	}
	for(int i = asp/2 - 1;i < asp - 1;i++){
		xx.push_back(-1);
		yy.push_back(-1);
	}
	int xl = asp / 2 - asc / 2;
	int yl = asp / 2 - asc / 2 - asc % 2;
	int l = 0;
	for(int i = 0; i < asp;i++){
		int ci = i;
		int rev = 0;
		int j = 0;
		while(j < jl){
			rev *= 2;
			rev += ci % 2;
			ci/=2;
			j++;
		}
		if(rev % 2){
			if(asp/2 - 1 - rev/2 < xl){
				continue;
			}
			l++;
			xx[asp - 2 - rev/2] = a[(int)a.size()-l];
		} else {
			if(asp/2 - 1 - rev/2 < yl){
				continue;
			}
			l++;
			yy[asp - 2 - rev/2] = a[(int)a.size()-l];
		}
		if(l == (int)a.size()){
			break;
		}
	}
	for(int j = (int)yy.size()-1;j>=1;j--){
		if(yy[j] == -1){
			if((j-1) % 2){
				yy[(j-1)/2] = -1;
			} else {
				xx[(j-1)/2] = -1;
			}
		}
	}
	vector<int>table;
	int cr = 0;
	for(int i = 0; i < asp - 1; i++){
		table.push_back(cr);
		if(yy[i] != -1){
			cr++;
		}
	}
	vector<int> x,y;
	for(int i = 0; i < asp - 1; i++){
		if(yy[i] != -1){
			if(xx[i] < 0){
				x.push_back(-table[-xx[i]-1]-1);
			} else {
				x.push_back(xx[i]);
			}
			if(yy[i] < 0){
				y.push_back(-table[-yy[i]-1]-1);
			} else {
				y.push_back(yy[i]);
			}
		}
	}
	answer(trig,x,y);
	return;
}
/*
#include <cstdio>
#include <cstdlib>
FILE * read;
namespace {

constexpr int P_MAX = 20000000;
constexpr int S_MAX = 400000;

int M, N;
std::vector<int> A;

bool answered;
int S;
std::vector<int> IC, IX, IY;

int read_int() {
  int x;
  if (fscanf(read,"%d", &x) != 1) {
    fprintf(stderr, "Error while reading input\n");
    exit(1);
  }
  return x;
}

void wrong_answer(const char *MSG) {
  printf("Wrong Answer: %s\n", MSG);
  exit(0);
}

void simulate() {
  if (S > S_MAX) {
    char str[50];
    sprintf(str, "over %d switches", S_MAX);
    wrong_answer(str);
  }
  for (int i = 0; i <= M; ++i) {
    if (!(-S <= IC[i] && IC[i] <= M)) {
      wrong_answer("wrong serial number");
    }
  }
  for (int j = 1; j <= S; ++j) {
    if (!(-S <= IX[j - 1] && IX[j - 1] <= M)) {
      wrong_answer("wrong serial number");
    }
    if (!(-S <= IY[j - 1] && IY[j - 1] <= M)) {
      wrong_answer("wrong serial number");
    }
  }

  int P = 0;
  std::vector<bool> state(S + 1, false);
  int pos = IC[0];
  int k = 0;
  FILE *file_log = fopen("log.txt", "w");
  fprintf(file_log, "0\n");
  for (;;) {
    fprintf(file_log, "%d\n", pos);
    if (pos < 0) {
      if (++P > P_MAX) {
        fclose(file_log);
        char str[50];
        sprintf(str, "over %d inversions", P_MAX);
        wrong_answer(str);
      }
      state[-pos] = !state[-pos];
      pos = state[-pos] ? IX[-(1 + pos)] : IY[-(1 + pos)];
    } else {
      if (pos == 0) {
        break;
      }
      if (k >= N) {
        fclose(file_log);
        wrong_answer("wrong motion");
      }
      if (pos != A[k++]) {
        fclose(file_log);
        wrong_answer("wrong motion");
      }
      pos = IC[pos];
    }
  }
  fclose(file_log);
  if (k != N) {
    wrong_answer("wrong motion");
  }
  for (int j = 1; j <= S; ++j) {
    if (state[j]) {
      wrong_answer("state 'Y'");
    }
  }
  printf("Accepted: %d %d\n", S, P);
}

}  // namespace

void answer(std::vector<int> C, std::vector<int> X, std::vector<int> Y) {
  if (answered) {
    wrong_answer("answered not exactly once");
  }
  answered = true;
  // check if input format is correct
  if ((int)C.size() != M + 1) {
    wrong_answer("wrong array length");
  }
  if (X.size() != Y.size()) {
    wrong_answer("wrong array length");
  }
  S = X.size();
  IC = C;
  IX = X;
  IY = Y;
}

int main() {
	read = fopen("06-01.txt","r");
	if(read == NULL){
		cout << "oof" << endl;
		return 0;
	}
  M = read_int();
  N = read_int();
  A.resize(N);
  for (int k = 0; k < N; ++k) {
    A[k] = read_int();
  }

  answered = false;
  create_circuit(M, A);
  if (!answered) {
    wrong_answer("answered not exactly once");
  }
  FILE *file_out = fopen("out.txt", "w");
  fprintf(file_out, "%d\n", S);
  for (int i = 0; i <= M; ++i) {
    fprintf(file_out, "%d\n", IC[i]);
  }
  for (int j = 1; j <= S; ++j) {
    fprintf(file_out, "%d %d\n", IX[j - 1], IY[j - 1]);
  }
  fclose(file_out);
  simulate();
  return 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...