Submission #757989

#TimeUsernameProblemLanguageResultExecution timeMemory
757989SanguineChameleonArchery (IOI09_archery)C++17
68 / 100
2085 ms4024 KiB
#include <bits/stdc++.h> using namespace std; void just_do_it(); int main() { #ifdef KAMIRULEZ freopen("kamirulez.inp", "r", stdin); freopen("kamirulez.out", "w", stdout); #endif ios_base::sync_with_stdio(0); cin.tie(0); just_do_it(); return 0; } const int maxN = 2e5 + 20; int a[maxN * 2]; int cnt1[maxN]; int cnt2[maxN]; int N, R, K; void simulate(int start, int lim, int cnt[]) { for (int i = 1; i <= N; i++) { cnt[i] = 0; } for (int i = 1; i <= start * 2 - 1; i++) { if (a[i] >= lim) { cnt[(i + 1) / 2]++; } } if (K >= lim) { cnt[start]++; } for (int i = start * 2; i <= N * 2 - 1; i++) { if (a[i] >= lim) { cnt[i / 2 + 1]++; } } vector<int> free; vector<int> holes; for (int i = 1; i <= N; i++) { if (cnt[i] == 2) { if (!holes.empty()) { cnt[holes.back()] = 1; holes.pop_back(); } else { free.push_back(i); } cnt[i] = 1; } else { if (cnt[1] == 1) { free.push_back(i); cnt[1] = 0; } if (cnt[i] == 0 && i > 1) { holes.push_back(i); } } } reverse(free.begin(), free.end()); for (int i = N; i > 1 && !free.empty(); i--) { if (cnt[i] == 0) { free.pop_back(); cnt[i] = 1; } } for (auto i: free) { cnt[((i - 1) + N - R % N) % N + 1]++; } } int solve(int start) { if (start == 1) { simulate(start, K, cnt1); } else if (a[start * 2 - 2] < K) { if (a[start * 2 - 3] < K) { if (a[start * 2 - 1] < K) { if (cnt1[start] == 0) { cnt1[start - 1] = 0; cnt1[start] = 1; } } } else { if (a[start * 2 - 1] >= K) { if (cnt1[((start - 2) + N - R % N) % N + 1] == 2) { cnt1[((start - 2) + N - R % N) % N + 1] = 1; cnt1[((start - 1) + N - R % N) % N + 1] = 2; } } else { simulate(start, K, cnt1); } } } if (start == 1 || (a[start * 2 - 2] > K)) { simulate(start, K + 1, cnt2); } for (int i = 1; i <= N; i++) { if (cnt1[i] != cnt2[i]) { return i; } } return -1; } void just_do_it() { cin >> N >> R >> K; for (int i = 1; i <= N * 2 - 1; i++) { cin >> a[i]; } if (N == 1) { cout << 1; return; } if (K == 1) { cout << N; return; } if (K == N * 2) { cout << 2; return; } pair<int, int> res = make_pair(N + 1, 0); for (int i = 1; i <= N; i++) { res = min(res, make_pair(solve(i), -i)); } cout << -res.second; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...