結果
問題 | No.972 選び方のスコア |
ユーザー | ir5 |
提出日時 | 2024-06-17 00:17:36 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 112 ms / 2,000 ms |
コード長 | 2,327 bytes |
コンパイル時間 | 1,974 ms |
コンパイル使用メモリ | 148,216 KB |
実行使用メモリ | 8,192 KB |
最終ジャッジ日時 | 2024-06-17 00:17:43 |
合計ジャッジ時間 | 6,176 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 32 |
ソースコード
#include <algorithm> #include <cassert> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <iostream> #include <numeric> #include <vector> #include <map> #include <set> #include <queue> #include <functional> #include <iomanip> using namespace std; using ll = long long; class range {private: struct I{int x;int operator*(){return x;}bool operator!=(I& lhs){return x<lhs.x;}void operator++(){++x;}};I i,n; public:range(int n_):i({0}),n({n_}){}range(int i_,int n_):i({i_}),n({n_}){}I& begin(){return i;}I& end(){return n;}}; template<class T, class U> ostream& operator<<(ostream& os, const pair<T, U>& p){ return os << "{" << p.first << ", " << p.second << "}"; } template<typename T> ostream& operator<<(ostream& os, const vector<T>& obj) { os << "{"; for (const auto& e : obj) os << e << ", "; return os << "}"; } template<typename T> ostream& operator<<(ostream& os, const set<T>& obj) { os << "set{"; for (const auto& e : obj) os << e << ", "; return os << "}"; } template<typename T, typename U> ostream& operator<<(ostream& os, const map<T, U>& obj) { os << "map{"; for (const auto& e : obj) os << e << ", "; return os << "}"; } #ifdef ONLINE_JUDGE #define dump(expr) ; #else #define dump(expr) { cerr << "\033[33m#L" << __LINE__ << ": " << expr << "\033[39m" << endl; } #endif template<typename T> struct PrefixSum { vector<T> sums; PrefixSum(vector<T> vs) { int n = (int)vs.size(); sums.resize(n + 1, (T)0); for (int i : range(n)) sums[i + 1] = sums[i] + vs[i]; } T sum(int i, int j) { // vs[i] + ... + vs[j] if (i > j) return (T)0; return sums[j + 1] - sums[i]; } }; ll solve() { ll n; cin >> n; vector<ll> vs(n); for (int i : range(n)) cin >> vs[i]; sort(vs.begin(), vs.end()); if (n <= 2) return 0; auto ps = PrefixSum(vs); ll best = 0; for (ll m = 1; m < n - 1; m++) { ll lo = 1, hi = min(m, n - m - 1) + 1; while (hi - lo > 1) { int r = (hi + lo) / 2; if (vs[m - r] + vs[n - r] - 2 * vs[m] > 0) lo = r; else hi = r; } ll r = lo; ll cand = ps.sum(m - r, m - 1) + ps.sum(n - r, n - 1) - 2 * r * vs[m]; dump(m << " => " << cand << "(" << r << " " << ")"); best = max(best, cand); } return best; } int main() { cout << fixed << setprecision(12); cout << solve() << endl; }