제출 #1022089

#제출 시각아이디문제언어결과실행 시간메모리
1022089ZanP자동 인형 (IOI18_doll)C++14
100 / 100
86 ms15372 KiB
#include "doll.h" #include <iostream> #include <vector> #include <algorithm> #include <unordered_map> using namespace std; void answer(vector<int> C, vector<int> X, vector<int> Y); struct xyswitch { int x, y; int par = 0; bool gox = true; bool active = true; xyswitch() {} xyswitch(int x, int y) { this->x = x; this->y = y; } }; vector<xyswitch> xyswitches; void make_switches(int m, int filler, int base_switch) { int f1 = min(filler, (m + filler) / 2), f2 = filler - f1; int s1 = ((m + filler) / 2) - f1, s2 = ((m + filler) / 2) - f2; xyswitches.push_back(xyswitch()); int sn = xyswitches.size() - 1; if (s1 == 0) { xyswitches[sn].x = -base_switch; } else if (s1 == 1 && f1 == 0) { xyswitches[sn].x = 0; } else { xyswitches[sn].x = -((int)xyswitches.size() + 1); make_switches(s1, f1, base_switch); xyswitches[-(xyswitches[sn].x) - 1].par = -(sn + 1); } if (s2 == 1 && f2 == 0) { xyswitches[sn].y = 0; } else { xyswitches[sn].y = -((int)xyswitches.size() + 1); make_switches(s2, f2, base_switch); xyswitches[-(xyswitches[sn].y) - 1].par = -(sn + 1); } } void connect(int val, int swid) { xyswitch & sw = xyswitches[-(swid)-1]; if (sw.gox) { sw.gox = !sw.gox; if (sw.x == 0) { sw.x = val; } else { connect(val, sw.x); } } else { sw.gox = !sw.gox; if (sw.y == 0) { sw.y = val; } else { connect(val, sw.y); } } } void create_circuit(int M, std::vector<int> A) { A.push_back(0); int n = A.size(); vector<int> c(M+1,0); int m = n, mxtwo = 1; while (mxtwo < m) { mxtwo *= 2; } make_switches(n, mxtwo - n, xyswitches.size() + 1); for (int j = 0; j < n; j++) { connect(A[j], -1); } vector<int> sums(xyswitches.size()); int sum = 0; for (int i = xyswitches.size() - 1; i >= 0; i--) { xyswitch & sw = xyswitches[i]; if (sw.x == sw.y) { sw.active = false; sum++; if (sw.par != 0) { xyswitch& swpar = xyswitches[-(sw.par) - 1]; if (swpar.x == -(i + 1)) { swpar.x = sw.x; } if (swpar.y == -(i + 1)) { swpar.y = sw.y; } } } sums[i] = sum; } for (int i = xyswitches.size() - 1; i >= 0; i--) { xyswitch& sw = xyswitches[i]; if (sw.x < 0) { int xid = -(sw.x) - 1; int xdif = sum - sums[xid]; sw.x = -(xid - xdif) - 1; } if (sw.y < 0) { int yid = -(sw.y) - 1; int ydif = sum - sums[yid]; sw.y = -(yid - ydif) - 1; } } for (int i = 0; i < M+1; i++) { c[i] = -1; } int s = xyswitches.size(); vector<int> x, y; x.reserve(s); y.reserve(s); for (int i = 0; i < s; i++) { if (!xyswitches[i].active)continue; x.push_back(xyswitches[i].x); y.push_back(xyswitches[i].y); } 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...