제출 #765685

#제출 시각아이디문제언어결과실행 시간메모리
765685marvinthang커다란 상품 (IOI17_prize)C++17
97.69 / 100
49 ms5268 KiB
/************************************* * author: marvinthang * * created: 25.06.2023 08:50:11 * *************************************/ #include "prize.h" #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define left ___left #define right ___right #define TIME (1.0 * clock() / CLOCKS_PER_SEC) #define MASK(i) (1LL << (i)) #define BIT(x, i) ((x) >> (i) & 1) #define __builtin_popcount __builtin_popcountll #define ALL(v) (v).begin(), (v).end() #define REP(i, n) for (int i = 0, _n = (n); i < _n; ++i) #define REPD(i, n) for (int i = (n); i--; ) #define FOR(i, a, b) for (int i = (a), _b = (b); i < _b; ++i) #define FORD(i, b, a) for (int i = (b), _a = (a); --i >= _a; ) #define FORE(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i) #define FORDE(i, b, a) for (int i = (b), _a = (a); i >= _a; --i) #define scan_op(...) istream & operator >> (istream &in, __VA_ARGS__ &u) #define print_op(...) ostream & operator << (ostream &out, const __VA_ARGS__ &u) #ifdef LOCAL #include "debug.h" #else #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); } #define DB(...) 23 #define db(...) 23 #define debug(...) 23 #endif template <class U, class V> scan_op(pair <U, V>) { return in >> u.first >> u.second; } template <class T> scan_op(vector <T>) { for (size_t i = 0; i < u.size(); ++i) in >> u[i]; return in; } template <class U, class V> print_op(pair <U, V>) { return out << '(' << u.first << ", " << u.second << ')'; } template <size_t i, class T> ostream & print_tuple_utils(ostream &out, const T &tup) { if constexpr(i == tuple_size<T>::value) return out << ")"; else return print_tuple_utils<i + 1, T>(out << (i ? ", " : "(") << get<i>(tup), tup); } template <class ...U> print_op(tuple<U...>) { return print_tuple_utils<0, tuple<U...>>(out, u); } template <class Con, class = decltype(begin(declval<Con>()))> typename enable_if <!is_same<Con, string>::value, ostream&>::type operator << (ostream &out, const Con &con) { out << '{'; for (__typeof(con.begin()) it = con.begin(); it != con.end(); ++it) out << (it == con.begin() ? "" : ", ") << *it; return out << '}'; } template <class A, class B> bool minimize(A &a, B b) { if (a > b) { a = b; return true; } return false; } template <class A, class B> bool maximize(A &a, B b) { if (a < b) { a = b; return true; } return false; } // end of template mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); template <class T> T rand(T l, T h) { return uniform_int_distribution <T> (l, h) (rng); } template <class T> T rand(T h) { return uniform_int_distribution <T> (0, h - 1) (rng); } int ma, res; vector <vector <int>> f; vector <int> ASK(int i) { if (f[i].empty()) f[i] = ask(i); return f[i]; } void solve(int l, int r, int cl, int cr) { if (~res || l > r || cl + cr == ma) return; int m = l + r >> 1; vector <int> a = ASK(m); if (!a[0] && !a[1]) { res = m; return; } if (a[0] + a[1] == ma) { int x = ma - cl - a[1]; int y = ma - cr - a[0]; if (x < y) { solve(l, m - 1, cl, a[1]); solve(m + 1, r, a[0], cr); } else { solve(m + 1, r, a[0], cr); solve(l, m - 1, cl, a[1]); } return; } int i = m; while (--i >= l) { a = ASK(i); if (!a[0] && !a[1]) { res = i; return; } if (a[0] + a[1] == ma) break; } if (i < l) { solve(m + 1, r, cl + m - l + 1, cr); } else { int x = ma - cl - a[1]; int y = ma - a[0] - m + i - cr; if (x < y) { solve(l, i - 1, cl, a[1]); solve(m + 1, r, a[0] + m - i, cr); } else { solve(m + 1, r, a[0] + m - i, cr); solve(l, i - 1, cl, a[1]); } } } int find_best(int n) { res = -1; f.assign(n, vector<int>()); ma = 0; REP(t, 500) { int i = rand(n); vector <int> a = ASK(i); if (!a[0] && !a[1]) return i; maximize(ma, a[0] + a[1]); } solve(0, n - 1, 0, 0); return res; } #ifdef LOCAL #include "prize.h" #include <iostream> #include <vector> #include <algorithm> using namespace std; static const int max_q = 5000; static int n; static int query_count = 0; static vector<int> g; static vector<vector<int> > rank_count; vector<int> ask(int i) { query_count++; if(query_count > max_q) { cerr << "Query limit exceeded" << endl; exit(0); } if(i < 0 || i >= n) { cerr << "Bad index: " << i << endl; exit(0); } vector<int> res(2); res[0] = rank_count[g[i] - 1][i + 1]; res[1] = rank_count[g[i] - 1][n] - res[0]; return res; } int main() { file("prize"); cin >> n; g.resize(n); for(int i = 0; i < n; i++) { cin >> g[i]; if(g[i] < 1) { cerr << "Invalid rank " << g[i] << " at index " << i << endl; exit(0); } } int max_rank = *max_element(g.begin(), g.end()); rank_count.resize(max_rank + 1, vector<int>(n + 1, 0)); for(int r = 0; r <= max_rank; r++) { for(int i = 1; i <= n; i++) { rank_count[r][i] = rank_count[r][i - 1]; if(g[i - 1] == r) rank_count[r][i]++; } } for(int i = 0; i <= n; i++) for(int r = 1; r <= max_rank; r++) rank_count[r][i] += rank_count[r - 1][i]; int res = find_best(n); if (g[res] != 1) return !(cout << "WA!\n"); cout << res << endl << "Query count: " << query_count << endl; return 0; } #endif

컴파일 시 표준 에러 (stderr) 메시지

prize.cpp: In function 'void solve(int, int, int, int)':
prize.cpp:60:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   60 |  int m = l + r >> 1;
      |          ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...