結果
問題 | No.1830 Balanced Majority |
ユーザー |
![]() |
提出日時 | 2022-02-04 22:10:11 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 32 ms / 2,000 ms |
コード長 | 3,693 bytes |
コンパイル時間 | 1,425 ms |
コンパイル使用メモリ | 128,264 KB |
最終ジャッジ日時 | 2025-01-27 19:11:32 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 25 |
ソースコード
#include <iostream>#include <algorithm>#include <iomanip>#include <vector>#include <queue>#include <deque>#include <set>#include <map>#include <tuple>#include <cmath>#include <numeric>#include <functional>#include <cassert>#include <random>#define debug_value(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << #x << "=" << x << endl;#define debug(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << x << endl;template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }using namespace std;typedef long long ll;template<typename T>vector<vector<T>> vec2d(int n, int m, T v){return vector<vector<T>>(n, vector<T>(m, v));}template<typename T>vector<vector<vector<T>>> vec3d(int n, int m, int k, T v){return vector<vector<vector<T>>>(n, vector<vector<T>>(m, vector<T>(k, v)));}template<typename T>void print_vector(vector<T> v, char delimiter=' '){if(v.empty()) {cout << endl;return;}for(int i = 0; i+1 < v.size(); i++) cout << v[i] << delimiter;cout << v.back() << endl;}template<typename T>class Cumsum{public:Cumsum(vector<T> v): v(v){n = v.size();v_cumsum = vector<T>(n+1, T(0));for(int i = 0; i < n; i++) v_cumsum[i+1] = v_cumsum[i]+v[i];}/*** v[l] + ... + v[r-1]*/T sum(int l, int r){if(r <= l) return T(0);if(r > n) r = n;if(l < 0) l = 0;return v_cumsum[r]-v_cumsum[l];}private:int n;vector<T> v;vector<T> v_cumsum;};class Simulator{public:int n;Simulator(int n): n(n) {n_asked = 0;v.resize(n);for(int i = 0; i < n/2; i++) v[i] = 1;random_device seed_gen;mt19937 engine(seed_gen());shuffle(v.begin(), v.end(), engine);cumsum = Cumsum<int>(v);}int asK(int k){n_asked++;return cumsum.sum(0, k);};void verify(int l, int r){print_vector(v);cout << l << ' ' << r << endl;int len = r-l+1;assert(len%2 == 0);assert(n_asked <= 20);int sum = cumsum.sum(l-1, r);debug_value(sum)assert(r-l+1 >= n/2);assert(sum == len/2);}private:int n_asked;vector<int> v;Cumsum<int> cumsum = Cumsum<int>(vector<int>(1));};// #define DEBUGint main(){ios::sync_with_stdio(false);cin.tie(0);cout << setprecision(10) << fixed;int n; cin >> n;#ifdef DEBUGauto sim = Simulator(n);#endifmap<int, ll> memo;auto ask_sum = [&](int k) -> ll{if(memo.count(k)) return memo[k];#ifdef DEBUGint ans = sim.asK(k);#elsecout << "? " << k << endl;int ans; cin >> ans;#endifmemo[k] = ans-(k-ans);return ans-(k-ans);};auto verify = [&](int l, int r){#ifdef DEBUGsim.verify(l, r);#elsecout << "! " << l << ' ' << r << endl;#endif};if(ask_sum(1) == ask_sum(n-1)){verify(2, n-1);return 0;}auto find_zero = [&](){int l = 1, r = n-1;while(true){int x = (l+r)/2;if(ask_sum(x) == 0) return x;if(ask_sum(l)*ask_sum(x) < 0){r = x;}else{assert(ask_sum(x)*ask_sum(r) < 0);l = x;}}};int idx = find_zero();assert(ask_sum(idx) == 0);// debug_value(idx);if(idx > n/2){verify(1, idx);}else{verify(idx+1, n);}}