Submission #1048237

#TimeUsernameProblemLanguageResultExecution timeMemory
1048237becaidoThe Big Prize (IOI17_prize)C++17
97.41 / 100
33 ms2148 KiB
#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx,popcnt,sse4,abm") #include <bits/stdc++.h> using namespace std; #ifdef WAIMAI #include "grader.cpp" #else #include "prize.h" #endif #ifdef WAIMAI #define debug(HEHE...) cout << "[" << #HEHE << "] : ", dout(HEHE) void dout() {cout << '\n';} template<typename T, typename...U> void dout(T t, U...u) {cout << t << (sizeof...(u) ? ", " : ""), dout(u...);} #else #define debug(...) 7122 #endif #define ll long long #define Waimai ios::sync_with_stdio(false), cin.tie(0) #define FOR(x,a,b) for (int x = a, I = b; x <= I; x++) #define pb emplace_back #define F first #define S second const int SIZE = 2e5 + 5; const int K = 500; int ans, bL, bR, mx, L[SIZE], R[SIZE]; vector<int> id; pair<int, int> que(int i) { if (L[i] == -1) { auto v = ask(i); L[i] = v[0], R[i] = v[1]; } return {L[i], R[i]}; } void check(int i) { if (ans != -1) return; auto [l, r] = que(i); if (l + r == 0) { ans = i; return; } id.pb(i); } queue<tuple<int, int, int, int, int>> q; void bfs() { auto [l, r, lc, rc, tot] = q.front(); q.pop(); if (r < bL || l > bR || ans != -1 || l > r || tot == 0) return; if (l == r) { check(l); return; } int mid = (l + r) / 2; FOR (i, mid, r) { if (ans != -1) return; auto [lcnt, rcnt] = que(i); if (lcnt + rcnt != mx) { check(i); if (lcnt + rcnt == 1) { if (lcnt == 1) bR = i; else bL = i; } continue; } lcnt -= lc, rcnt -= rc; q.emplace(l, mid - 1, lc, rc + (i - mid) + rcnt, tot - (i - mid) - rcnt); q.emplace(i + 1, r, lc + lcnt, rc, tot - lcnt); return; } q.emplace(l, mid - 1, lc, rc + (r - mid + 1), tot - (r - mid + 1)); } int find_best(int n) { FOR (i, 0, n - 1) L[i] = R[i] = -1; if (n < K) { FOR (i, 0, n - 1) { auto [l, r] = que(i); if (l == 0 && r == 0) return i; } } mx = 0; FOR (i, 0, K - 1) { auto [l, r] = que(i); mx = max(mx, l + r); } id.clear(); ans = -1; FOR (i, 0, K - 1) { auto [l, r] = que(i); if (l + r != mx) check(i); } bL = -1, bR = n; q.emplace(K, n - 1, id.size(), 0, mx - id.size()); while (q.size()) bfs(); for (int i : id) check(i); return ans; } /* in1 8 3 2 3 1 3 3 2 3 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...