제출 #1325376

#제출 시각아이디문제언어결과실행 시간메모리
1325376adiyer코알라 (APIO17_koala)C++20
100 / 100
33 ms456 KiB
#include "koala.h" #include <bits/stdc++.h> using namespace std; int minValue(int n, int w) { int b[n], r[n]; memset(b, 0, sizeof(b)); b[0] = 1; playRound(b, r); for(int i = 0; i < n; i++) if(r[i] == 0) return i; memset(b, 0, sizeof(b)); b[1] = 1; playRound(b, r); for(int i = 0; i < n; i++) if(r[i] == 0) return i; return 0; } int maxValue(int n, int w) { int b[n], r[n]; memset(b, 0, sizeof(b)); for(int i = 0; i < n; i++) b[i] = 1; playRound(b, r); memset(b, 0, sizeof(b)); for(int i = 0; i < n; i++) if(r[i] > 1) b[i] = 2; playRound(b, r); memset(b, 0, sizeof(b)); for(int i = 0; i < n; i++) if(r[i] > 1) b[i] = 4; playRound(b, r); memset(b, 0, sizeof(b)); for(int i = 0; i < n; i++) if(r[i] > 1) b[i] = 11; playRound(b, r); for(int i = 0; i < n; i++) if(r[i] > 1) return i; return 0; } int greaterValue(int n, int w) { int b[n], r[n]; memset(b, 0, sizeof(b)); b[0] = b[1] = 5; playRound(b, r); if(r[0] > 5 && r[1] <= 5) return 0; if(r[0] <= 5 && r[1] > 5) return 1; if(r[0] <= 5 && r[1] <= 5){ memset(b, 0, sizeof(b)); b[0] = b[1] = 3; playRound(b, r); if(r[0] > 3 && r[1] <= 3) return 0; if(r[0] <= 3 && r[1] > 3) return 1; memset(b, 0, sizeof(b)); b[0] = b[1] = 1; playRound(b, r); if(r[0] > 1 && r[1] <= 1) return 0; if(r[0] <= 1 && r[1] > 1) return 1; } if(r[0] > 5 && r[1] > 5){ memset(b, 0, sizeof(b)); b[0] = b[1] = 8; playRound(b, r); if(r[0] > 8 && r[1] <= 8) return 0; if(r[0] <= 8 && r[1] > 8) return 1; } return 0; } bool comp(int n, int i, int j){ int b[n], r[n]; for(int i = 0; i < n; i++) b[i] = 0; for(int i = 0; i < n; i++) r[i] = 0; b[i] = b[j] = 100; playRound(b, r); return r[i] <= 100; } void solve(vector < int > pos, int n, int w, int *p, int l = 1, int r = 100){ if(l == r){ p[pos[0]] = l; return; } vector < int > pos1, pos2; int B[n], R[n], x = min((int)sqrt(2 * l), w / (r - l + 1)); for(int i = 0; i < n; i++) B[i] = 0; for(int i = 0; i < n; i++) R[i] = 0; for(int i : pos) B[i] = x; playRound(B, R); for(int i : pos){ if(R[i] > x) pos2.push_back(i); else pos1.push_back(i); } if(pos1.empty() || pos2.empty()) return; solve(pos1, n, w, p, l, l + pos1.size() - 1); solve(pos2, n, w, p, r - pos2.size() + 1, r); } void allValues(int n, int w, int *p) { if(w == 200){ int b[n], r[n], pos = -1; for(int i = 0; i < n; i++) p[i] = b[i] = r[i] = 0; for(int i = 0; i < n; i++) b[i] = 1; b[0] = 2; playRound(b, r); for(int i = 0; i < n; i++) if(r[i] <= 1) pos = i; if(pos == -1){ memset(b, 0, sizeof(b)); for(int i = 0; i < 100; i++) b[i] = 1; b[1] = 2; playRound(b, r); for(int i = 0; i < n; i++) if(r[i] <= 1) pos = i; } p[pos] = 1; vector < int > vals; vals.push_back(pos); for(int i = 0; i < n; i++){ if(i == pos) continue; int l = 0, tr = vals.size(); while(tr - l > 1){ int m = (l + tr) / 2; if(comp(n, vals[m], i)) l = m; else tr = m; } vector < int > upd; for(int j = 0; j <= l; j++) upd.push_back(vals[j]); upd.push_back(i), p[i] = tr + 1; for(int j = tr; j < vals.size(); j++) upd.push_back(vals[j]), p[vals[j]]++; vals = upd; } } else{ for(int i = 0; i < n; i++) p[i] = 0; vector < int > pos; for(int i = 0; i < n; i++) pos.push_back(i); solve(pos, n, w, p); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...