QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#615896 | #9440. Train Seats | ucup-team5062# | WA | 0ms | 3596kb | C++17 | 2.6kb | 2024-10-05 20:52:32 | 2024-10-05 20:52:32 |
Judging History
answer
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const long long INF = 3LL << 59;
string to_string(const vector<int>& arr) {
string res = "[";
for (int i = 0; i < arr.size(); i++) {
if (i != 0) {
res += ", ";
}
res += to_string(arr[i]);
}
res += "]";
return res;
}
vector<int> convex_hull(int N, const vector<long long>& A) {
vector<int> p;
for (int i = 0; i <= N; i++) {
while (p.size() >= 2) {
int t1 = p[p.size() - 1];
int t2 = p[p.size() - 2];
long long c1 = (i - t1) * (A[i] - A[t2]);
long long c2 = (i - t2) * (A[i] - A[t1]);
if (c1 >= c2) {
p.pop_back();
} else {
break;
}
}
p.push_back(i);
}
return p;
}
vector<long long> give_minus(const vector<long long>& A) {
vector<long long> res(A.size());
for (int i = 0; i < int(A.size()); i++) {
res[i] = -A[i];
}
return res;
}
long long solve(int N, const vector<long long>& A) {
// step #1. compute convex hull
vector<int> low = convex_hull(N, A);
vector<int> high = convex_hull(N, give_minus(A));
// step #2. compute track
string track;
int lp = 0, rp = high.size() - 1;
while (lp != low.size() - 1 || rp != 0) {
int choice = -1;
if (rp == 0) {
choice = 0;
} else if (lp == low.size()) {
choice = 1;
} else {
choice = (1LL * (A[high[rp]] - A[high[rp - 1]]) * (low[lp + 1] - low[lp]) - 1LL * (A[low[lp + 1]] - A[low[lp]]) * (high[rp] - high[rp - 1]) > 0 ? 0 : 1);
}
if (choice == 0) {
track += string(low[lp + 1] - low[lp], 'L');
lp++;
} else {
track += string(high[rp] - high[rp - 1], 'R');
rp--;
}
}
// step #3. calculate set
vector<long long> sumA(N + 2);
for (int i = 0; i <= N; i++) {
sumA[i + 1] = sumA[i] + A[i];
}
vector<long long> offset(N + 1);
for (int i = 1; i <= N - 1; i++) {
long long v1 = sumA[i];
long long v2 = sumA[N + 1] - sumA[i + 1];
offset[i] = v2 - v1;
}
// step #3. brute force midpoint
int l = 0, r = N; long long curcost = 0;
long long ans = -INF;
for (int i = 0; i < N - 2; i++) {
if (track[i] == 'L') {
long long subans = curcost + A[r] * (r - l - 2) + offset[r - 1];
ans = max(ans, subans);
curcost += A[r];
l++;
} else {
long long subans = curcost - A[l] * (r - l - 2) + offset[l + 1];
curcost -= A[l];
r--;
}
}
ans = max(ans, curcost + offset[r - 1]);
return ans;
}
int main() {
int N; long long M;
cin >> N >> M;
vector<long long> A(N + 2);
for (int i = 1; i <= N; i++) {
cin >> A[i];
}
A[N + 1] = M + 1;
long long ans = solve(N + 1, A);
cout << ans << endl;
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3568kb
input:
3 10 3 7 10
output:
28
result:
ok "28"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3564kb
input:
5 20 3 10 11 14 17
output:
73
result:
ok "73"
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 3596kb
input:
10 1000000000 136909656 243332691 643531997 505919307 43553384 657638276 57213246 179732866 357373203 182482400
output:
7174795384
result:
wrong answer 1st words differ - expected: '7649951260', found: '7174795384'