제출 #1181061

#제출 시각아이디문제언어결과실행 시간메모리
1181061n3rm1n코알라 (APIO17_koala)C++20
90 / 100
37 ms876 KiB
#include "koala.h" #include <bits/stdc++.h> #define pb push_back using namespace std; const int maxn = 1e5 + 10; int minValue(int N, int W) { int n = N; int b[N+1], r[N+1]; for (int i = 0; i < N; ++ i) { b[i] = 0; r[i] = 0; } b[0] = 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 n = N; int b[n+1], r[n+1]; vector < int > pot; for (int i = 0; i < n; ++ i) pot.pb(i); while(pot.size() > 1) { int dajba = n/pot.size(); for (int i = 0; i < n; ++ i) { b[i] = 0; r[i] = 0; } for (int i = 0; i < pot.size(); ++ i) { int x = pot[i]; b[x] = dajba; } playRound(b, r); vector < int > newpot; for (int i = 0; i < pot.size(); ++ i) { int taken = pot[i]; if(r[taken])newpot.pb(taken); } pot = newpot; } return pot[0]; } int greaterValue(int N, int W) { int n = N; int b[N], r[N]; int l = 0, ri = 9, mid; while(l <= ri) { mid = (l + ri)/2; for (int i = 0; i < n; ++ i) { b[i] = 0; r[i] = 0; } b[0] = b[1] = mid; playRound(b, r); if(r[0] == r[1]) { if(r[0])l = mid + 1; else ri = mid - 1; } else if(r[0])return 0; else return 1; } return 0; } int n, w; int b[maxn], rk[maxn]; vector < int > solve(vector < int > g, int l, int r) { for (int i = 0; i < g.size(); ++ i) { int x = g[i]; } vector < int > ans; if(r < l)return ans; if(l == r)return g; int sz = r - l + 1; int other = (int)(sqrt(2*l)); if(n != w)other *= 2; int dajba = min(other, w / sz); for (int i = 0; i < n; ++ i) { b[i] = 0; rk[i] = 0; } for (int i = 0; i < g.size(); ++ i) { b[g[i]] = dajba; } playRound(b, rk); vector < int > bigger, smaller; for (int i = 0; i < n; ++ i) { if(b[i] && rk[i])bigger.pb(i); else if(b[i])smaller.pb(i); } int cnt1 = smaller.size(); int cnt2 = bigger.size(); smaller = solve(smaller, l, l + cnt1 - 1); bigger = solve(bigger, l + cnt1, r); for (int i = 0; i < smaller.size(); ++ i) ans.pb(smaller[i]); for (int i = 0; i < bigger.size(); ++ i) ans.pb(bigger[i]); return ans; } void allValues(int N, int W, int *P) { n = N; w = W; if (W == 2*N) { vector < int > g; for (int i = 0; i < N; ++ i) g.pb(i); g = solve(g, 1, N); for (int i = 0; i < g.size(); ++ i) { int pos = g[i]; P[pos] = i + 1; } } else { vector < int > g; for (int i = 0; i < N; ++ i) g.pb(i); g = solve(g, 1, N); for (int i = 0; i < g.size(); ++ i) { int pos = g[i]; P[pos] = i + 1; } } }
#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...