Submission #3665349


Source Code Expand

#include <algorithm>
#include <array>
#include <bitset>
#include <complex>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <set>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <queue>

using namespace std;

struct BoolName : numpunct<char> {
  string t, f;
  BoolName (string t = "Yes", string f = "No") : t(t), f(f) {}
  string do_truename() const {return t;}
  string do_falsename() const {return f;}
};

struct Initializer {
  Initializer() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout << fixed << setprecision(15) << boolalpha;
    cout.imbue(locale(cout.getloc(), new BoolName));
  }
} initializer;

template<typename T> istream& operator>>(istream &s, vector<T> &v) {
  for (T &t : v) s >> t;
  return s;
}

template<typename T> ostream& operator<<(ostream &s, const vector<T> &v) {
  for (const T &t : v) s << t << endl;
  return s;
}

void set_bool_name(string t, string f) {
  cout.imbue(locale(cout.getloc(), new BoolName(t, f)));
}

int64_t binarySearch(function<bool(int64_t)> func, int64_t include, int64_t exclude) {
  while (abs(exclude - include) > 1) {
    int64_t middle = (include + exclude) / 2;
    (func(middle) ? include : exclude) = middle;
  }
  return include;
}

template<typename T> bool chmin(T& a, T b) {return a > b ? a = b, true : false;}

template<typename T> bool chmax(T& a, T b) {return a < b ? a = b, true : false;}

template<typename T> T min(const vector<T>& v) {return *min_element(v.begin(), v.end());}

template<typename T> T max(const vector<T>& v) {return *max_element(v.begin(), v.end());}

template<typename T> int min_element(vector<T>& v) {return min_element(v.begin(), v.end()) - v.begin();}

template<typename T> int max_element(vector<T>& v) {return max_element(v.begin(), v.end()) - v.begin();}

template<typename T> void sort(vector<T>& v) {sort(v.begin(), v.end());}

template<typename T, typename Function> void sort(vector<T>& v, Function func) {sort(v.begin(), v.end(), func);}

template<typename T> void rsort(vector<T>& v) {sort(v.rbegin(), v.rend());}

template<typename T> void reverse(vector<T>& v) {reverse(v.begin(), v.end());}

template<typename T> void unique(vector<T>& v) {v.erase(unique(v.begin(), v.end()), v.end());}

template<typename T> void nth_element(vector<T>& v, int n) {nth_element(v.begin(), v.begin() + n, v.end());}

template<typename T> bool next_permutation(vector<T>& v) {return next_permutation(v.begin(), v.end());}

template<typename T> int find(vector<T>& v, T t) {return find(v.begin(), v.end(), t) - v.begin();}

template<typename T> int in(vector<T> v, T t) {return find(v, t) != int(v.size());}

template<typename T> int lower_bound(vector<T>& v, T t) {return lower_bound(v.begin(), v.end(), t) - v.begin();}

template<typename T> int upper_bound(vector<T>& v, T t) {return upper_bound(v.begin(), v.end(), t) - v.begin();}

template<typename T> T accumulate(const vector<T>& v, function<T(T, T)> func = plus<T>()) {return accumulate(v.begin(), v.end(), T(), func);}

template<typename T> void adjacent_difference(vector<T>& v) {adjacent_difference(v.begin(), v.end(), v.begin());}

template<typename T> void adjacent_difference(vector<T>& v, vector<T>& u) {adjacent_difference(v.begin(), v.end(), u.begin());}

template<typename T> void partial_sum(vector<T>& v, vector<T>& u) {partial_sum(v.begin(), v.end(), u.begin());}

template<typename T> T inner_product(vector<T>& v, vector<T>& u) {return inner_product(v.begin(), v.end(), u.begin(), T(0));}

template<typename T> int count(const vector<T>& v, T t) {return count(v.begin(), v.end(), t);}

template<typename T, typename Function> int count_if(const vector<T>& v, Function func) {return count_if(v.begin(), v.end(), func);}

template<typename T, typename Function> void remove_if(vector<T>& v, Function func) {v.erase(remove_if(v.begin(), v.end(), func), v.end());}

template<typename T, typename Function> bool all_of(vector<T> v, Function func) {return all_of(v.begin(), v.end(), func);}

template<typename T, typename Function> bool any_of(vector<T> v, Function func) {return any_of(v.begin(), v.end(), func);}

template<typename T, typename Function> bool none_of(vector<T> v, Function func) {return none_of(v.begin(), v.end(), func);}

template<typename T> vector<T> subvector(vector<T>& v, int a, int b) {return vector<T>(v.begin() + a, v.begin() + b);}

template<typename T> int kinds(const vector<T>& v) {return set<T>(v.begin(), v.end()).size();}

template<typename T> map<T, int> count_kinds(const vector<T>& v) {
  map<T, int> res;
  for (const auto& i : v) ++res[i];
  return res;
}

template<typename T> void iota(vector<T>& v, T t = 0) {iota(v.begin(), v.end(), t);}

template<typename T> bool is_sorted(const vector<T>& v) {return is_sorted(v.begin(), v.end());}

int n;
vector<int64_t> a, b;

unordered_map<int, int> mem1, mem2;

int solve2(int, int64_t);

int solve1(int k, int64_t res) {
  if (k == n) return 0;
  if (mem1.count(k)) return mem1[k];
  int r = -1e9;
  for (int i = k + 1; i <= n; ++i) {
    int t = (b[i] - b[k] >= res) ? 1 : -1;
    chmax(r, solve2(i, res) + t);
  }
  return mem1[k] = r;
}

int solve2(int k, int64_t res) {
  if (k == n) return 0;
  if (mem2.count(k)) return mem2[k];
  int r = 1e9;
  for (int i = k + 1; i <= n; ++i) {
    int t = (b[i] - b[k] < res) ? 1 : -1;
    chmin(r, solve1(i, res) - t);
  }
  return mem2[k] = r;
}

bool solve(int64_t res) {
  mem1.clear();
  mem2.clear();
  int a = solve1(0, res);
  return a >= 0;
}

int main() {
  cin >> n;
  a.resize(n);
  cin >> a;
  b.resize(n + 2);
  for (int i = 0; i < n; ++i) b[i + 1] = b[i] + a[i];
  cout << binarySearch(solve, accumulate(a), 1e15) << endl;
}

Submission Info

Submission Time
Task H - Median Game
User not
Language C++11 (GCC 4.8.1)
Score 500
Code Size 5714 Byte
Status AC
Exec Time 1741 ms
Memory 512 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 2
AC × 32
Set Name Test Cases
Sample s1.txt, s2.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, s1.txt, s2.txt
Case Name Status Exec Time Memory
01.txt AC 1 ms 256 KB
02.txt AC 1 ms 256 KB
03.txt AC 1 ms 256 KB
04.txt AC 1 ms 256 KB
05.txt AC 1 ms 256 KB
06.txt AC 1 ms 256 KB
07.txt AC 1 ms 256 KB
08.txt AC 1 ms 256 KB
09.txt AC 1 ms 256 KB
10.txt AC 1 ms 256 KB
11.txt AC 1703 ms 384 KB
12.txt AC 1582 ms 384 KB
13.txt AC 1449 ms 384 KB
14.txt AC 1629 ms 384 KB
15.txt AC 1482 ms 384 KB
16.txt AC 1665 ms 384 KB
17.txt AC 1720 ms 384 KB
18.txt AC 1581 ms 384 KB
19.txt AC 1675 ms 384 KB
20.txt AC 1677 ms 384 KB
21.txt AC 1581 ms 384 KB
22.txt AC 1647 ms 384 KB
23.txt AC 1628 ms 384 KB
24.txt AC 1584 ms 384 KB
25.txt AC 1655 ms 384 KB
26.txt AC 1617 ms 384 KB
27.txt AC 1587 ms 384 KB
28.txt AC 1741 ms 512 KB
29.txt AC 1567 ms 384 KB
30.txt AC 1690 ms 384 KB
s1.txt AC 1 ms 256 KB
s2.txt AC 1 ms 256 KB