제출 #395939

#제출 시각아이디문제언어결과실행 시간메모리
395939usachevd0커다란 상품 (IOI17_prize)C++17
90 / 100
109 ms2636 KiB
#include <bits/stdc++.h> #ifndef DEBUG #include "prize.h" #endif using namespace std; #define fi first #define se second #define mp make_pair #define pb push_back #define all(a) (a).begin(), (a).end() using ll = long long; using ull = unsigned long long; using pii = pair<int, int>; using pil = pair<int, ll>; using pli = pair<ll, int>; using pll = pair<ll, ll>; using ld = long double; template<typename T1, typename T2> bool chkmin(T1 &x, T2 y) { return y < x ? (x = y, true) : false; } template<typename T1, typename T2> bool chkmax(T1 &x, T2 y) { return y > x ? (x = y, true) : false; } void debug_out() { cerr << endl; } template<typename T1, typename... T2> void debug_out(T1 A, T2... B) { cerr << ' ' << A; debug_out(B...); } template<typename T> void mdebug_out(T* a, int n) { for (int i = 0; i < n; ++i) { cerr << a[i] << ' '; } cerr << endl; } #ifdef DEBUG #define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__) #define mdebug(a, n) cerr << #a << ": ", mdebug_out(a, n) #else #define debug(...) 1337 #define mdebug(a, n) 1337 #endif template<typename T> ostream& operator << (ostream& stream, const vector<T> &v) { for (auto& x : v) { stream << x << ' '; } return stream; } template<typename T1, typename T2> ostream& operator << (ostream& stream, const pair<T1, T2>& p) { return stream << p.first << ' ' << p.second; } const int maxN = 200005; #ifdef DEBUG int a[maxN]; int cnt[maxN]; pii f[maxN]; vector<int> ask(int i) { return {f[i].fi, f[i].se}; } #endif pii res[maxN]; int val[maxN]; set<int> vals; pii Ask(int i) { if (res[i].fi != -1) { return res[i]; } auto a = ask(i); val[i] = a[0] + a[1]; vals.insert(val[i]); return res[i] = {a[0], a[1]}; } int find_best(int n) { memset(res, 255, sizeof res); memset(val, 255, sizeof val); vals.clear(); #define ASK(i) Ask(i); if (!val[i]) return i int i = 0; while (i < n) { ASK(i); bool i_not_max = val[i] != *vals.rbegin(); int vl = i; int vr = n; while (vr - vl > 1 && !i_not_max) { int vm = (vl + vr) >> 1; ASK(vm); if (val[vm] == val[i]) { if (res[i].fi == res[vm].fi) { vl = vm; } else { vr = vm; } } else if (val[vm] > val[i]) { i_not_max = true; break; } else { vr = vm; } } if (i_not_max) { ++i; continue; } ASK(vr); i = vr + 1; } throw; } #ifdef DEBUG int32_t main() { #ifdef DEBUG freopen("in", "r", stdin); #endif ios::sync_with_stdio(0); cin.tie(0); mt19937 rng(228); int n = 5; int C = 3; for (int itr = 1; ; ++itr) { int M = -1e9; int one_i = rng() % n; a[one_i] = 1; fill(cnt, cnt + C + 1, 0); for (int i = 0; i < n; ++i) { if (i != one_i) { a[i] = rng() % (C - 1) + 2; } chkmax(M, a[i]); ++cnt[a[i]]; f[i].fi = accumulate(cnt, cnt + a[i], 0); } bool bad = false; for (int k = 2; k <= M; ++k) { if (cnt[k] <= cnt[k - 1] * (ll)cnt[k - 1]) { bad = true; break; } } if (bad) continue; fill(cnt, cnt + C + 1, 0); for (int i = n - 1; i >= 0; --i) { ++cnt[a[i]]; f[i].se = accumulate(cnt, cnt + a[i], 0); } int i = find_best(n); assert(0 <= i && i < n && a[i] == 1); debug(itr); } /*int n; cin >> n; for (int i = 0; i < n; ++i) { cin >> a[i]; ++cnt[a[i]]; f[i].fi = accumulate(cnt, cnt + a[i], 0); } fill(cnt, cnt + n + 1, 0); for (int i = n - 1; i >= 0; --i) { ++cnt[a[i]]; f[i].se = accumulate(cnt, cnt + a[i], 0); } mdebug(f, n); int i = find_best(n); debug(i); assert(0 <= i && i < n && a[i] == 1);*/ return 0; } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...