結果
| 問題 |
No.919 You Are A Project Manager
|
| コンテスト | |
| ユーザー |
machy
|
| 提出日時 | 2019-10-25 23:48:34 |
| 言語 | C++17(clang) (17.0.6 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2,531 ms / 3,000 ms |
| コード長 | 2,280 bytes |
| コンパイル時間 | 985 ms |
| コンパイル使用メモリ | 130,644 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-30 15:34:32 |
| 合計ジャッジ時間 | 34,956 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 55 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
LL getPlaced(vector<LL>& a, LL begin, LL end, LL place){
LL pivot = a[(begin+end)/2];
LL large = 0;
LL same = 0;
for(LL i = begin; i < end-large; ){
if(a[i] > pivot){
swap(a[end-1-large], a[i]);
++large;
}else if(a[i] == pivot){
swap(a[begin+same], a[i]);
++same;
++i;
}else{
++i;
}
}
//cerr << "debug " << begin << ", " << end << ", " << place << ", " << same << ", " << large << endl;
LL n = end - begin;
if(place < n - same - large){
return getPlaced(a, begin+same, end-large, place);
}else if(place < n - large){
return pivot;
}else{
return getPlaced(a, end-large, end, place - (n-large));
}
}
LL getMedian(vector<LL>& a, LL begin, LL end){
LL n = end - begin;
return getPlaced(a, begin, end, (n-1)/2);
}
void build(vector<LL>& a, LL n, LL k, vector<LL>& left, vector<LL>& left_cum){
for(LL i = 0; (i+1)*k <= n; ++i){
left[i] = getMedian(a, i*k, (i+1)*k);
}
LL cur = 0;
for(LL i = 0; i < left.size(); ++i){
cur += left[i];
left_cum[i+1] = max(cur, left_cum[i]);
}
}
LL solve(vector<LL> a, LL n, LL k){
vector<LL> b = a;
reverse(b.begin(), b.end());
vector<LL> left(n / k);
vector<LL> right(n / k);
vector<LL> left_cum(n / k + 1);
vector<LL> right_cum(n / k + 1);
build(a, n, k, left, left_cum);
build(b, n, k, right, right_cum);
LL ans = 0;
for(LL i = 0; i < left_cum.size(); ++i){
ans = max(ans, left_cum[i] + right_cum[right_cum.size()-1-i]);
}
/*
cerr << "k=" << k << endl;
for(LL i = 0; i < left_cum.size(); ++i){
cerr << "left " << left_cum[i] << endl;
}
for(LL i = 0; i < left_cum.size(); ++i){
cerr << "right " << right_cum[i] << endl;
}
cerr << "best=" << ans * k << endl;
*/
return ans * k;
}
int main(){
LL N;
cin >> N;
vector<LL> a(N);
for(LL i = 0; i < N; ++i){
cin >> a[i];
}
LL ans = 0;
for(LL k = 1; k <= N; ++k){
ans = max(ans, solve(a, N, k));
}
cout << ans << endl;
}
machy