제출 #652103

#제출 시각아이디문제언어결과실행 시간메모리
652103blue죄수들의 도전 (IOI22_prison)C++17
100 / 100
12 ms1272 KiB
#include "prison.h" #include <bits/stdc++.h> using namespace std; using vi = vector<int>; using vvi = vector<vi>; #define sz(x) int(x.size()) const int stp = 21; int N; vector<string> addr; vi dp(1+stp); vi inv(1 + 6'000); vi spl(1+stp); vi dep; void selfmax(int& a, int b) { a = max(a, b); } void build_tree(int l, int r, int i) { assert(l != r); addr[l].push_back('L'); l++; addr[r].push_back('R'); r--; if(i == 1) { return; } else if(i == 2) { addr[l].push_back('0'); addr[l+1].push_back('0'); build_tree(l, l+1, 1); } else { int k; if(dp[i] == 3*dp[i-3] + 2) k = 3; else k = 2; int j = (r-l+1)/k; for(int ki = 0; ki < k; ki++) { int l1 = l + j*ki; int r1 = l + j*(ki+1) - 1; for(int n = l1; n <= r1; n++) addr[n].push_back('0' + ki); build_tree(l1, r1, i-k); } } } vvi devise_strategy(int N_) { dp[0] = -100; dp[1] = 2; dp[2] = 4; for(int i = 3; i <= stp; i++) { if(i-3 >= 1) selfmax(dp[i], 3*dp[i-3] + 2); if(i-2 >= 1) selfmax(dp[i], 2*dp[i-2] + 2); if(dp[i] == 3*dp[i-3] + 2) spl[i] = 3; else spl[i] = 2; } spl[2] = 1; spl[1] = 0; for(int i = 1; i <= stp; i++) inv[dp[i]] = i; N = dp[stp]; addr = vector<string>(1+N, ""); build_tree(1, N, stp); int x = dp[stp]; vvi res(stp, vi(1+N, 0)); vi depsiz; vi depspl; vvi depind; for(int z = N; z >= 3; z = (z-2)/spl[inv[z]]) { depsiz.push_back(z); depspl.push_back(spl[inv[z]]); } depsiz.push_back(2); depspl.push_back(1); int u = 1; for(int d = 0; d < sz(depsiz)-1; d++) { depind.push_back({}); for(int e = 0; e < depspl[d]; e++) { depind[d].push_back(u++); } } res[0][0] = 0; for(int i = 1; i <= N; i++) { if(addr[i][0] == 'L') res[0][i] = -1; else if(addr[i][0] == 'R') res[0][i] = -2; else { res[0][i] = depind[0][ addr[i][0] - '0' ]; } } for(int d = 0; d < sz(depsiz)-1; d++) { for(int z = 0; z < depspl[d]; z++) { int xi = depind[d][z]; if(d % 2 == 0) res[xi][0] = 1; else res[xi][1] = 0; for(int i = 1; i <= N; i++) { if(sz(addr[i]) - 1 < d) { res[xi][i] = 0; } if(addr[i][d] == 'L') res[xi][i] = -2 + (d%2); else if(addr[i][d] == 'R') res[xi][i] = -1 - (d%2); else if(addr[i][d] - '0' < z) res[xi][i] = -2 + (d%2); else if(addr[i][d] - '0' > z) res[xi][i] = -1 - (d%2); else if(addr[i][d] - '0' == z) { if(addr[i][d+1] == 'L') res[xi][i] = -2 + (d%2); else if(addr[i][d+1] == 'R') res[xi][i] = -1 - (d%2); else res[xi][i] = depind[d+1][addr[i][d+1] - '0']; } } } } for(int xi = 0; xi < stp; xi++) res[xi].resize(1+N_); return res; }

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

prison.cpp: In function 'vvi devise_strategy(int)':
prison.cpp:105:6: warning: unused variable 'x' [-Wunused-variable]
  105 |  int x = dp[stp];
      |      ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...