제출 #626747

#제출 시각아이디문제언어결과실행 시간메모리
626747flashmt죄수들의 도전 (IOI22_prison)C++17
90 / 100
13 ms1108 KiB
#include <bits/stdc++.h> using namespace std; // 3 ** 6 * 7 > 5000 const int BASE = 3; const int POWER = 6; const int REMAIN = 7; vector<vector<int>> devise_strategy(int n) { vector<vector<int>> ans; vector<vector<int>> digits(729); for (int i = 0; i < 729; i++) { for (int j = 0, x = i; j < POWER; j++) { digits[i].push_back(x % BASE); x /= BASE; } reverse(begin(digits[i]), end(digits[i])); } // 0 { vector<int> a = {0}; for (int j = 0; j < n; j++) a.push_back(digits[j / REMAIN][0] + 1); ans.push_back(a); } // [1, 18] for (int i = 0; i < POWER; i++) for (int x = 0; x < BASE; x++) { int otherBag = i % 2, curBag = otherBag ^ 1; vector<int> a = {curBag}; for (int j = 0; j < n; j++) { auto curDigits = digits[j / REMAIN]; if (curDigits[i] < x) a.push_back(-curBag - 1); else if (curDigits[i] > x) a.push_back(-otherBag - 1); else if (i < POWER - 1) a.push_back((i + 1) * BASE + curDigits[i + 1] + 1); else // last digit { int rem = j % REMAIN; if (rem == 0) a.push_back(-curBag - 1); else if (rem == 6) a.push_back(-otherBag - 1); else if (rem <= 2) a.push_back(19); // 1, 2 else if (rem <= 4) a.push_back(20); // 3, 4 else a.push_back(21); // 5 } } ans.push_back(a); } // [19, 21] for (int i : {19, 20, 21}) { int otherBag = 0, curBag = 1; vector<int> a = {1}; for (int j = 0; j < n; j++) { int rem = j % REMAIN; if (rem <= 1) a.push_back(-curBag - 1); else if (rem >= 5) a.push_back(-otherBag - 1); else if (rem <= 3) a.push_back(-(i == 19 ? otherBag : curBag) - 1); else a.push_back(-(i == 21 ? curBag : otherBag) - 1); } ans.push_back(a); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...