제출 #1060820

#제출 시각아이디문제언어결과실행 시간메모리
1060820ArthuroWich자동 인형 (IOI18_doll)C++17
100 / 100
110 ms15292 KiB
#include "doll.h" #include<bits/stdc++.h> using namespace std; struct node { int l = INT_MIN, r = INT_MIN, y = 0, valid = 0, d = 0; }; int timer = 2, dep, vl, vr; vector<int> x, y; node tree[500005]; void build(int n, int d) { tree[n].d = d; if (dep-1 == d) { return; } tree[n].l = -timer; timer++; tree[n].r = -timer; timer++; build(-tree[n].l, d+1); build(-tree[n].r, d+1); } void find(int n, int d, int l, int r) { int m = (l+r)/2; if (dep-1 == d) { if (tree[n].y == 0) { vl = l; vr = l; } else { vl = r; vr = r; } } else { if (tree[n].y == 0) { find(-tree[n].l, d+1, l, m); } else { find(-tree[n].r, d+1, m+1, r); } } } void create(int n, int d, int v) { if (dep-1 == d) { if (tree[n].y == 0) { tree[n].l = v; } else { tree[n].r = v; } } else { if (tree[n].y == 0) { create(-tree[n].l, d+1, v); } else { create(-tree[n].r, d+1, v); } } tree[n].y ^= 1; } void clean(int n, int d) { if (dep-1 == d) { if (tree[n].l != INT_MIN || tree[n].r != INT_MIN) { tree[n].valid = 1; } } else { clean(-tree[n].l, d+1); clean(-tree[n].r, d+1); tree[n].valid |= tree[-tree[n].l].valid; tree[n].valid |= tree[-tree[n].r].valid; } } void create_circuit(int m, vector<int> a) { vector<int> d(m+1, 0); d[0] = a[0]; if (a.size() == 1) { answer(d, x, y); return; } d[a[0]] = -1; for (int i : a) { d[i] = -1; } int n = a.size(), s; dep = ceil(log2(n)); s = 1 << dep; build(1, 0); int acl = 1, acr = s-(n-s/2); int j = 1; for (int i = 1; i < s; i++) { find(1, 0, 1, s); if ((s/2) < vl && vl <= acr) { create(1, 0, INT_MIN); } else { create(1, 0, a[j]); j++; } } create(1, 0, 0); clean(1, 0); int co = 1; vector<int> conv(s, 0); for (int i = 1; i < s; i++) { if (tree[i].valid == 0) { continue; } conv[i] = co; co++; } for (int i = 1; i < s; i++) { if (tree[i].valid == 0) { continue; } if (tree[i].l >= 0) { x.push_back(tree[i].l); } else if (tree[i].l == INT_MIN || tree[-tree[i].l].valid == 0) { x.push_back(-1); } else { x.push_back(-conv[-tree[i].l]); } if (tree[i].r >= 0) { y.push_back(tree[i].r); } else if (tree[i].r == INT_MIN || tree[-tree[i].r].valid == 0) { y.push_back(-1); } else { y.push_back(-conv[-tree[i].r]); } } answer(d, x, y); }

컴파일 시 표준 에러 (stderr) 메시지

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:83:9: warning: unused variable 'acl' [-Wunused-variable]
   83 |     int acl = 1, acr = s-(n-s/2);
      |         ^~~
#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...