Submission #249713

#TimeUsernameProblemLanguageResultExecution timeMemory
249713stoyan_malininMechanical Doll (IOI18_doll)C++14
0 / 100
56 ms71724 KiB
#include "doll.h" //#include "grader.cpp" #include <iostream> using namespace std; const int MAXN = 5e5 + 5; int usedSwitches = 0; struct Switch { static int switchCnt; int num; int state; int out[2]; Switch() { this->num = switchCnt; switchCnt++; this->state = 0; this->out[0] = this->out[1] = MAXN; } }; int Switch::switchCnt = 0; Switch s[MAXN]; struct RouterOutput { int switchNum, outNum; RouterOutput(){} RouterOutput(int switchNum, int outNum) { this->outNum = outNum; this->switchNum = switchNum; } void assignDirection(int nxt) { s[switchNum].out[outNum] = nxt; } }; struct Router { int root, sz; vector <RouterOutput> outs; Router(){} Router(int sz) { usedSwitches++; this->root = usedSwitches; this->sz = sz; build(root, 0, sz-1); //initOuts(); } void build(int sInd, int l, int r) { //cout << sInd << " || " << l << " " << r << '\n'; if(l+1==r) return; if(l+2==r) { usedSwitches++; s[sInd].out[0] = -usedSwitches; return; } usedSwitches++; s[sInd].out[0] = -usedSwitches; usedSwitches++; s[sInd].out[1] = -usedSwitches; build(s[sInd].out[0], l, (l+r)/2); build(s[sInd].out[0], (l+r)/2+1, r); } void initOuts() { for(int i = 0;i<sz;i++) { int sInd = root; while(true) { if(s[sInd].out[ s[sInd].state ]==MAXN) { outs.push_back(RouterOutput(sInd, s[sInd].state)); s[sInd].state ^= 1; break; } s[sInd].state ^= 1; sInd = -s[sInd].out[ s[sInd].state^1 ]; } } if(outs.size()!=sz) answer({}, {}, {}); //for(RouterOutput x: outs) cout << x.switchNum << " " << x.outNum << '\n'; } }; Router r[MAXN]; vector <int> nxt[MAXN]; void create_circuit(int M, vector <int> A) { vector <int> C(M+1); A.push_back(0); for(int i = 0;i<A.size()-1;i++) nxt[ A[i] ].push_back(A[i+1]); C[0] = A[0]; for(int i = 1;i<=M;i++) { if(nxt[i].size()>1) { int sz = 1; while(sz<nxt[i].size()) sz *= 2; r[i] = Router(sz); C[i] = -r[i].root; } else { if(nxt[i].size()==1) C[i] = nxt[i][0]; else C[i] = 0; } } answer({}, {}, {}); for(int x = 1;x<=M;x++) { if(nxt[x].size()<=1) continue; int useLess = r[x].sz - nxt[x].size(); for(int i = 0;i<useLess;i++) r[x].outs[i].assignDirection(-r[x].root); for(int i = 0;i<nxt[x].size();i++) { r[x].outs[useLess+i].assignDirection(nxt[x][i]); } } //cout << '\n'; //for(int i = 0;i<=M;i++) cout << C[i] << '\n'; vector <int> X(usedSwitches), Y(usedSwitches); for(int i = 1;i<=usedSwitches;i++) { X[i-1] = s[i].out[0]; Y[i-1] = s[i].out[1]; //cout << X[i-1] << " " << Y[i-1] << '\n'; } answer(C, X, Y); } /* 4 4 1 2 1 3 4 7 1 3 4 2 1 2 2 5 11 1 2 5 2 3 4 1 2 5 5 4 5 4 1 1 1 1 */

Compilation message (stderr)

doll.cpp: In member function 'void Router::initOuts()':
doll.cpp:111:23: warning: comparison of integer expressions of different signedness: 'std::vector<RouterOutput>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  111 |         if(outs.size()!=sz) answer({}, {}, {});
      |            ~~~~~~~~~~~^~~~
doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:124:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  124 |     for(int i = 0;i<A.size()-1;i++) nxt[ A[i] ].push_back(A[i+1]);
      |                   ~^~~~~~~~~~~
doll.cpp:132:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  132 |             while(sz<nxt[i].size()) sz *= 2;
      |                   ~~^~~~~~~~~~~~~~
doll.cpp:153:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  153 |         for(int i = 0;i<nxt[x].size();i++)
      |                       ~^~~~~~~~~~~~~~
#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...