제출 #766844

#제출 시각아이디문제언어결과실행 시간메모리
766844Dorost도서관 (JOI18_library)C++17
100 / 100
296 ms460 KiB
#include <cstdio> #include <vector> #include <iostream> #include "library.h" using namespace std; const int MaxN = 1012; vector <int> g[MaxN]; int n; vector <int> res; int sz (vector <int> v) { int ans = 0; for (int i : v) ans += i; return ans; } int get (int x, int l, int r) { vector <int> W(n); for (int i = 0; i < n; i++) W[i] = 0; for (int i = l - 1; i <= r - 1; i++) W[i] = 1; W[x - 1] = false; int a = (l == r ? 0 : sz(W) - Query(W)); W[x - 1] = 1; int b = (l == 1 && r == n ? n - 1 : sz(W) - Query(W)); int wef = 0; for (int u : g[x]) wef += ((u >= l) && (u <= r)); return b - a - wef; } void dfs (int v, int p = -1) { res.push_back(v); for (int u : g[v]) if (u != p) dfs (u, v); } void Solve(int N) { if (N <= 2) { vector <int> wef(N); for (int i = 0; i < N; i++) wef[i] = i + 1; Answer(wef); return; } n = N; for (int i = 1; i <= n; i++) { while ((int)g[i].size() < 2) { if (g[i].size() == 1 && get (i, 1, n) == 0) { break; } else { int l = 1, r = n; while (r != l) { int mid = (l + r) >> 1; if (get (i, l, mid)) r = mid; else l = mid + 1; } g[i].push_back(l); g[l].push_back(i); } } } int root = 0; for (int i = 1; i <= n; i++) if (g[i].size() == 1) root = i; dfs (root); Answer(res); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...