제출 #1210762

#제출 시각아이디문제언어결과실행 시간메모리
1210762qwusha죄수들의 도전 (IOI22_prison)C++20
48.50 / 100
11 ms1352 KiB
#include <bits/stdc++.h> #include "prison.h" using namespace std; #define fi first #define se second typedef long long ll; typedef long double ld; mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count()); ll inf = 1e18; ll K = 5001; vector<vector<int>> devise_strategy(int n) { vector<vector<int>> s(32, vector<int>(n + 1)); for (int val = 0; val < 32; val++) { if (val % 4 == 0) { s[val][0] = 0; for (int x = 1; x <= n; x++) { int l = 1, r = K; int done = val / 4; for (int i = 0; i < done + 1; i++) { int mid1 = (2*l + r) / 3; int mid2 = (l + 2*r) / 3; if (i == done) { if (x < mid1) { s[val][x] = 4 * done + 1; } else if (x < mid2) { s[val][x] = 4 * done + 2; } else { s[val][x] = 4 * done + 3; } } else { if (x < mid1) { r = mid1; } else if (x < mid2) { l = mid1; r = mid2; } else { l = mid2; } } } } } else { s[val][0] = 1; for (int x = 1; x <= n; x++) { int l = 1, r = K; int done = val / 4; int typ = val % 4; s[val][x] = (done + 1) * 4 % 32; for (int i = 0; i < done + 1; i++) { int mid1 = (2*l + r) / 3; int mid2 = (l + 2*r) / 3; if (i == done) { if (x < mid1) { if (typ > 1) { s[val][x] = -2; } } else if (x < mid2) { if (typ == 1) { s[val][x] = -1; } else if (typ == 3) { s[val][x] = -2; } } else { if (typ < 3) { s[val][x] = -1; } } } else { if (x < mid1) { r = mid1; } else if (x < mid2) { l = mid1; r = mid2; } else { l = mid2; } } } } } } return s; } /* bool judge(int a, int b) { auto s = devise_strategy(K - 1); int cur = 0; set<int> st; while (cur >= 0) { if (st.find(cur) != st.end()) { cout << "CYCLING? NUMBER " << cur << " ON CASE " << a << ' ' << b << endl; exit(0); } st.insert(cur); int val = a; if (s[cur][0] == 1) { val = b; } cur = s[cur][val]; } if (cur == -1) { return a < b; } else { return a > b; } } signed main() { auto s = devise_strategy(K - 1); for (int i = 0; i < 10000; i++) { int a = rnd() % (K - 1) + 1; int b = rnd() % (K - 1) + 1; while (a == b) { b = rnd() % (K - 1) + 1; } if (!judge(a, b)) { cout << "FAIL ON " << a << ' ' << b << endl; return 0; } if (i % 200 == 99) { cout << "SUCCESS" << endl; } } cout << "TOTAL SUCCESS" << endl; }*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...