제출 #735311

#제출 시각아이디문제언어결과실행 시간메모리
735311GusterGoose27죄수들의 도전 (IOI22_prison)C++17
100 / 100
12 ms1492 KiB
#include "prison.h" using namespace std; typedef pair<int, int> pii; #include <bits/stdc++.h> class range { public: int l, r; int par; int id; range(int l, int r, int p, int i) : l(l), r(r), par(p), id(i) {} range() {} }; const int n = 5102; const int x = 21; int strat[21][n+1]; bool parity[21]; vector<int> ranges[22]; vector<range> range_list; void make_strat() { range_list.push_back(range(1, n, -1, 0)); ranges[0].push_back(0); for (int i = 0; i <= 15; i++) { int nxt_start = 3*((i+2)/3)+1; parity[nxt_start] = parity[nxt_start+1] = parity[nxt_start+2] = !parity[i]; for (int v: ranges[i]) { range r = range_list[v]; int sz = (r.r-r.l)/3; range_list.push_back(range(r.l+1, r.l+sz, v, nxt_start)); range_list.push_back(range(r.l+sz+1, r.l+2*sz, v, nxt_start+1)); range_list.push_back(range(r.l+2*sz+1, r.l+3*sz, v, nxt_start+2)); ranges[nxt_start].push_back(range_list.size()-3); ranges[nxt_start+1].push_back(range_list.size()-2); ranges[nxt_start+2].push_back(range_list.size()-1); } } for (int i = 16; i <= 18; i++) { int nxt_start = 3*((i+2)/3)+1; for (int v: ranges[i]) { range r = range_list[v]; range_list.push_back(range(r.l+1, r.r-1, v, nxt_start)); ranges[nxt_start].push_back(range_list.size()-1); } } parity[19] = !parity[18]; parity[20] = parity[18]; for (int v: ranges[19]) { range r = range_list[v]; range_list.push_back(range(r.l+1, r.r-1, v, 20)); ranges[20].push_back(range_list.size()-1); } // for (int v: ranges[20]) { // range r = range_list[v]; // cout << r.l << ' ' << r.r << '\n'; // } strat[0][0] = 0; strat[0][1] = -1; strat[0][n] = -2; for (int i = 1; i < 21; i++) { fill(strat[i], strat[i]+n+1, 0); strat[i][0] = parity[i]; for (int v: ranges[i]) { range r = range_list[v]; for (int j = range_list[r.par].l; j <= r.l; j++) strat[i][j] = -1-parity[i]; for (int j = r.r; j <= range_list[r.par].r; j++) strat[i][j] = -2+parity[i]; for (int j = r.l; j <= r.r; j++) strat[range_list[r.par].id][j] = i; } } } vector<vector<int>> devise_strategy(int N) { make_strat(); vector<vector<int>> res(21, vector<int>(N+1)); for (int i = 0; i < 21; i++) { for (int j = 0; j <= N; j++) res[i][j] = strat[i][j]; } return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...