이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define D(x) cerr << #x << " = " << x << ", "
using vi = vector<int>;
using vvi = vector<vi>;
vi compute_ksums(const vi& a, int k) {
int n = a.size();
vi v(2*n);
for (int i = 0; i < n; ++i) {
v[i] = v[n+i] = a[i];
}
vi pre(2*n+1); // pre[i+1] = v[0]+...+v[i]
for (int i = 0; i < 2*n; ++i) {
pre[i+1] = pre[i] + v[i];
}
vi ksums(n); // ksums[i] = v[i] + ... + v[i+k-1]
for (int i = 0; i < n; ++i) {
ksums[i] = pre[i+k] - pre[i];
}
return ksums;
}
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
int n;
cin >> n;
int k = n/2; // range of the deffender
int sum = 0;
vi v(n);
for (int i = 0; i < n; ++i) {
cin >> v[i];
sum += v[i];
}
vi ksums = compute_ksums(v, k);
multiset<int> s;
int l = 1;
int r = n-k;
int ans = 0;
for (int i = l; i <= r; ++i) {
s.insert(-ksums[i]);
}
for (int i = 0; i < n; ++i) {
int best = -(*s.begin());
ans = max(ans, sum-best);
r = (r+1)%n;
s.insert(-ksums[r]);
s.erase(s.find(-ksums[l]));
++l;
}
/*int ans = 0;
for (int i = 0; i < n; ++i) {
int best = 0;
for (int j = 0; j < n; ++j) {
int l = j;
int r = j+k-1;
if ((i < l or i > r) and (n+i < l or n+i > r)) {
best = max(best, ksums[j]);
}
}
ans = max(ans, sum-best);
}*/
cout << ans << endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |