結果
| 問題 |
No.972 選び方のスコア
|
| コンテスト | |
| ユーザー |
shibh308
|
| 提出日時 | 2019-12-06 15:12:23 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 178 ms / 2,000 ms |
| コード長 | 1,863 bytes |
| コンパイル時間 | 3,940 ms |
| コンパイル使用メモリ | 204,796 KB |
| 最終ジャッジ日時 | 2025-01-08 09:23:47 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 32 |
ソースコード
#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
template <typename T>
struct DisjointSparseTable{
function<T(T, T)> f;
vector<vector<T>> v;
DisjointSparseTable(vector<T>& inp, function<T(T, T)> f) : f(f){
int n = inp.size();
int b;
for(b = 0; (1 << b) <= inp.size(); ++b);
v.assign(b, vector<T>(n));
for(int i = 0; i < n; ++i)
v[0][i] = inp[i];
for(int i = 1; i < b; ++i){
int siz = 1 << i;
for(int j = 0; j < n; j += siz << 1){
int t = min(j + siz, n);
v[i][t - 1] = inp[t - 1];
for(int k = t - 2; k >= j; --k)
v[i][k] = f(inp[k], v[i][k + 1]);
if(t >= n)
break;
v[i][t] = inp[t];
int r = min(t + siz, n);
for(int k = t + 1; k < r; ++k)
v[i][k] = f(v[i][k - 1], inp[k]);
}
}
}
T get(int l, int r){
if(l >= --r)
return v[0][l];
int p = 31 - __builtin_clz(l ^ r);
return f(v[p][l], v[p][r]);
}
};
signed main(){
int n;
cin >> n;
vector<i64> a(n);
for(auto& x : a)
cin >> x;
sort(a.begin(), a.end());
DisjointSparseTable<i64> d(a, [](auto x, auto y){return x + y;});
auto f = [&](int i, int len){
int x = a[i - len];
int y = a[n - len];
return x + y - 2 * a[i] >= 0;
};
i64 ans = 0;
for(int i = 1; i < n - 1; ++i){
int ok = 0, ng = min(i + 1, n - i);
while(ng - ok > 1){
int mid = (ok + ng) / 2;
(f(i, mid) ? ok : ng) = mid;
}
if(ok == 0)
continue;
ans = max(ans, d.get(n - ok, n) + d.get(i - ok, i) - a[i] * 2 * ok);
}
cout << ans << endl;
}
shibh308