제출 #805377

#제출 시각아이디문제언어결과실행 시간메모리
805377peijar코알라 (APIO17_koala)C++17
30 / 100
556 ms1096 KiB
#include "koala.h" #include <bits/stdc++.h> using namespace std; string to_string(string s) { return s; } template <typename T> string to_string(T v) { bool first = true; string res = "["; for (const auto &x : v) { if (!first) res += ", "; first = false; res += to_string(x); } res += "]"; return res; } void dbg_out() { cout << endl; } template <typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cout << ' ' << to_string(H); dbg_out(T...); } #ifdef DEBUG #define dbg(...) cout << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__) #else #define dbg(...) #endif vector<bool> simulate(vector<int> P, vector<int> B, int N, int W) { int i, j; int S = 0; for (i = 0; i < N; ++i) { if (!(B[i] >= 0 && B[i] <= W)) { printf("Invalid query.\n"); exit(0); } S += B[i]; } if (S > W) { printf("Invalid query.\n"); exit(0); } int cache[2][205]; int num[2][205]; char taken[105][205]; for (i = 0; i < 205; ++i) { cache[1][i] = 0; num[1][i] = 0; } for (i = 0; i < N; ++i) { int v = B[i] + 1; int ii = i & 1; int o = ii ^ 1; for (j = 0; j <= W; ++j) { cache[ii][j] = cache[o][j]; num[ii][j] = num[o][j]; taken[i][j] = 0; } for (j = W; j >= v; --j) { int h = cache[o][j - v] + P[i]; int hn = num[o][j - v] + 1; if (h > cache[ii][j] || (h == cache[ii][j] && hn > num[ii][j])) { cache[ii][j] = h; num[ii][j] = hn; taken[i][j] = 1; } else { taken[i][j] = 0; } } } int cur = W; vector<bool> take(N); for (i = N - 1; i >= 0; --i) { take[i] = taken[i][cur]; int R = taken[i][cur] ? (B[i] + 1) : 0; cur -= R; } return take; } using ll = long long; bool doesSeparate(int N, int W, int x, int i, int j) { vector<int> other; for (int k = 1; k <= N; ++k) if (i != k and j != k) other.push_back(k); reverse(other.begin(), other.end()); array<array<ll, 2>, 2> sol; for (int p = 0; p < 2; ++p) sol[p].fill(0); for (int take0 = 0; take0 < 2; ++take0) for (int take1 = 0; take1 < 2; ++take1) { int restant = W - (x + 1) * (take0 + take1); if (restant < 0) continue; sol[take0][take1] = i * take0 + j * take1; for (int k = 0; k < restant and k < (int)other.size(); ++k) sol[take0][take1] += other[k]; } int best = max({sol[0][0], sol[0][1], sol[1][0], sol[1][1]}); return best == sol[0][1] or best == sol[1][0]; } int minValue(int N, int W) { vector<int> b(N); b[0] = 1; vector<int> r(N); playRound(b.data(), r.data()); for (int i = 0; i < N; ++i) if (b[i] >= r[i]) return i; assert(false); } int maxValue(int N, int W) { vector<int> candidats(N); iota(candidats.begin(), candidats.end(), 0); while (candidats.size() > 1) { int nbCandidats = candidats.size(); vector<int> b(N); for (int u : candidats) b[u] = W / nbCandidats; vector<int> r(N); playRound(b.data(), r.data()); ; vector<int> nxt; for (int u : candidats) if (b[u] < r[u]) nxt.push_back(u); candidats = nxt; } assert(!candidats.empty()); return candidats[0]; return 0; } bool separates[51][101][101]; void initGreaterValue() { static bool initialized = false; if (!initialized) { initialized = true; for (int x = 1; x <= 50; ++x) for (int i = 1; i <= 100; ++i) for (int j = i + 1; j <= 100; ++j) separates[x][i][j] = doesSeparate(100, 100, x, i, j); } } int greaterValue(int N, int W) { initGreaterValue(); vector<pair<int, int>> candidats; for (int i = 1; i <= N; ++i) for (int j = i + 1; j <= N; ++j) candidats.emplace_back(i, j); while (true) { int bestX = -1; int largest = 0; for (int x = 1; x <= W / 2; ++x) { int cnt = 0; for (auto [i, j] : candidats) if (separates[x][i][j]) cnt++; if (largest < cnt) largest = cnt, bestX = x; } int x = bestX; vector<int> b(N), r(N); b[0] = b[1] = x; playRound(b.data(), r.data()); int take0 = b[0] < r[0]; int take1 = b[1] < r[1]; dbg(x, take0, take1); if (take0 == take1) { vector<pair<int, int>> nxtCandidats; for (auto [i, j] : candidats) if (!separates[x][i][j]) nxtCandidats.emplace_back(i, j); candidats = nxtCandidats; } else if (take0) return 0; else return 1; } } void allValues(int N, int W, int *P) { if (W == 2 * N) { // TODO: Implement Subtask 4 solution here. // You may leave this block unmodified if you are not attempting this // subtask. } else { // TODO: Implement Subtask 5 solution here. // You may leave this block unmodified if you are not attempting this // subtask. } }
#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...