제출 #657013

#제출 시각아이디문제언어결과실행 시간메모리
657013lumibons죄수들의 도전 (IOI22_prison)C++17
100 / 100
13 ms1000 KiB
#include "prison.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; pair<int, int> reduce(int v, int t) { // cerr << "reducing " << v << " by " << t << ": "; v--; int h = 3 * 3 * 3 * 3 * 3 * 22, a; for (int i = 0; i < min(t, 5); i++) { h /= 3; v %= h; } if (t < 5) a = v / (h / 3); for (int i = 0; i < min(t - 5, 2); i++) { if (v == 0 || v == h - 1) return {v, v == 0 ? -1 : -2}; v--; h -= 2; h /= 2; v %= h; } if (t >= 5 && t < 7) a = v == 0 ? -1 : (v == h - 1 ? -2 : (v - 1) / ((h - 2) / 2)); if (t == 7) a = v == 0 ? -1 : (v == h - 1 ? -2 : 0); if (t > 7) { if (v == 0 || v == h - 1) return {v, v == 0 ? -1 : -2}; v--; h -= 2; a = v == 0 ? -1 : -2; } // cerr << v << " " << a << " " << h << "\n"; return {v, a}; } tuple<int, int, int> pile(int x) { int p = 0; int i = 0, j = 0; if (x) p ^= 1, j++; for (i = 0; i < 5 && x > 3; i++, x -= 3, j++) p ^= 1; if (i == 5) { for (i = 0; i < 2 && x > 2; i++, x -= 2, j++) p ^= 1; if (i == 2 && x > 1) i = 0, j++, x--, p ^= 1; } return {p, x, j}; } int undo(int x, int t) { for (int i = 0; i < min(5, t); i++) x += 3; for (int i = 5; i < min(7, t); i++) x += 2; if (t == 8) x++; return x; } int action(int x, int v) { if (x == 0) { auto [nv, a] = reduce(v, 0); if (a < 0) return a; return a + 1; } auto [p, nx, t] = pile(x); auto [nv, a] = reduce(v, t - 1); if (a < 0) return a ^ p; if (a + 1 != nx) return (a + 1 < nx ? -1 : -2) ^ p; auto [nnv, na] = reduce(v, t); if (na < 0) return na ^ p; return undo(na + 1, t); } std::vector<std::vector<int>> devise_strategy(int N) { vector<vector<int>> s(21, vector<int>(N + 1)); for (int x = 0; x < 21; x++) { auto [p, nx, t] = pile(x); s[x][0] = p; for (int v = 1; v <= N; v++) s[x][v] = action(x, v); } return s; }

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

prison.cpp: In function 'std::pair<int, int> reduce(int, int)':
prison.cpp:40:15: warning: 'a' may be used uninitialized in this function [-Wmaybe-uninitialized]
   40 |   return {v, a};
      |               ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...