Submission #82228

#TimeUsernameProblemLanguageResultExecution timeMemory
82228KLPPMechanical Doll (IOI18_doll)C++14
84 / 100
154 ms19244 KiB
#include "doll.h" #include<iostream> #include<vector> using namespace std; #define INF 10000000 int reverse(int a,int exp){ int ans=0; while(exp--){ans*=2; ans+=a%2; a/=2; }//cout<<endl; return ans; } vector<int> X(1000000); vector<int> Y(1000000); int N; int point; void build(int level,int size){ point--; if(level==1){ if(size==2){ X[-point-1]=-INF; Y[-point-1]=-INF; }else{ X[-point-1]=-1; Y[-point-1]=-INF; } return; } int P=(1<<(level-1)); if(size<=P){ X[-point-1]=-1; Y[-point-1]=point-1; build(level-1,size); return; }int start=point; X[-start-1]=point-1; build(level-1,size-P); Y[-start-1]=point-1; build(level-1,P); } int pointer; vector<int> Sequence; bool state[1000000]; void DFS(int node){ //cout<<node<<endl; if(node==0)return; if(node<0){ int num=-node-1; if(!state[num]){ if(X[num]==-INF){ X[num]=Sequence[pointer]; pointer++; }state[num]=true; DFS(X[num]); }else{ if(Y[num]==-INF){ Y[num]=Sequence[pointer]; pointer++; }state[num]=false; DFS(Y[num]); } return; } DFS(-1); } void create_circuit(int M, std::vector<int> A) {vector<int> C(M+1); A.push_back(0); for(int i=0;i<=M;i++)C[i]=-1; C[0]=A[0]; A.erase(A.begin()); N = A.size(); int pow=1; int exp=0; while(pow<N){ pow*=2; exp++; }point=0; build(exp,N); pointer=0; for(int i=0;i<N;i++)Sequence.push_back(A[i]); for(int i=0;i<2*N;i++)state[i]=false; DFS(-1); while(X.size()>-point){ X.pop_back(); Y.pop_back(); } //cout<<exp<<endl; /*for(int i=0;i<-point;i++){ cout<<X[i]<<" "<<Y[i]<<endl; }*/ /*for(int i=0;i<pow/2-1;i++){ X[i]=2*(-i-1); Y[i]=2*(-i-1)-1; //cout<<-i-1<<" "<<X[i]<<" "<<Y[i]<<endl; } for(int i=pow/2;i<pow;i++){ int orderX=2*i-pow; int orderY=2*i+1-pow; //cout<<orderX<<" "<<orderY<<endl; //cout<<reverse(orderX,exp)<<endl; //cout<<reverse(orderY,exp)<<endl; int rX=reverse(orderX,exp); int rY=reverse(orderY,exp); //cout<<rX<<" "<<rY<<endl; if(rX+N>=pow){ X[i-1]=A[rX-pow+N]; }else X[i-1]=-1; if(rY+N>=pow){ Y[i-1]=A[rY-pow+N]; }else Y[i-1]=-1; }*/ //cout<<pow<<endl; answer(C,X,Y); }

Compilation message (stderr)

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:85:16: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   85 |  while(X.size()>-point){
      |        ~~~~~~~~^~~~~~~
#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...