제출 #808675

#제출 시각아이디문제언어결과실행 시간메모리
808675thimote75코알라 (APIO17_koala)C++14
59 / 100
50 ms340 KiB
#include "koala.h" #include <bits/stdc++.h> using namespace std; using di = pair<int, int>; using vd = vector<di>; using idata = vector<int>; using bdata = vector<bool>; const int MAXN = 100; int R[MAXN], B[MAXN]; bdata defaultExclusion(MAXN, false); idata playRound (vd V, bdata &exclusion, int offset = 0) { for (int i = 0; i < MAXN; i ++) B[i] = offset; for (const auto &x : V) B[x.first] = x.second; playRound(B, R); idata answer; for (int i = 0; i < MAXN; i ++) if (B[i] < R[i] && !exclusion[i]) answer.push_back(i); return answer; } vd fill (idata values, int count) { vd answer; for (int u : values) answer.push_back({ u, count }); return answer; } int minValue(int N, int W) { idata result = playRound({ { 0, 1 } }, defaultExclusion); int answer = -1; for (int i = 0; i < N; i ++) if (R[i] == 0) answer = i; return answer; } int maxValue(int N, int W) { idata answer(N); iota(answer.begin(), answer.end(), 0); bdata exclusion(N); idata firstSubset = playRound(fill( answer, 1 ), exclusion); for (int i = 0; i < N; i ++) exclusion[i] = true; for (int u : firstSubset) exclusion[u] = false; idata secondSubset = playRound(fill( firstSubset, N / firstSubset.size()), exclusion); for (int i = 0; i < N; i ++) exclusion[i] = true; for (int u : secondSubset) exclusion[u] = false; idata thirdSubset = playRound(fill( secondSubset, N / secondSubset.size()), exclusion); for (int i = 0; i < N; i ++) exclusion[i] = true; for (int u : thirdSubset) exclusion[u] = false; idata fourthSubset = playRound(fill( thirdSubset, N / thirdSubset.size()), exclusion); for (int i = 0; i < N; i ++) exclusion[i] = true; for (int u : fourthSubset) exclusion[u] = false; if (fourthSubset.size() != 0) return fourthSubset[0]; if (thirdSubset .size() != 0) return thirdSubset [0]; if (secondSubset.size() != 0) return secondSubset[0]; return firstSubset[0]; } int greaterValue(int N, int W, int p0 = 0, int p1 = 1) { bdata exclusion(N, true); exclusion[0] = false; exclusion[1] = false; int a = 1; int b = 9; int p = -1; while (b - a > 1) { int c = (a + b) >> 1; if (c != 2) playRound({ {p0, c}, {p1, c} }, exclusion); else playRound({ {p0, c}, {p1, c}, { p, W - 2 * c } }, exclusion); if (p == -1) for (int u = 0; u < MAXN; u ++) if (B[u] < R[u] && p0 != u && p1 != u) p = u; bool h0 = B[p0] < R[p0]; bool h1 = B[p1] < R[p1]; if (h0 ^ h1) return h0 ? p0 : p1; if (h0 && h1) a = c; else b = c; } // (P_0, P_1) est soit (1, 2), soit (2, 1) return -1; } int greaterValue(int N, int W) { return greaterValue(N, W, 0, 1); } void allValues2 (int N, int W, int* P) { } struct Comp { bool operator() (int a, int b) { return greaterValue(100, 100, a, b) == b; } }; void allValues(int N, int W, int *P) { if (W == 2*N) { allValues2 (N, W, P); return ; } idata values(N); iota(values.begin(), values.end(), 0); sort(values.begin(), values.end(), Comp()); for (int i = 0; i < N; i ++) P[values[i]] = i + 1; }
#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...