QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#615896#9440. Train Seatsucup-team5062#WA 0ms3596kbC++172.6kb2024-10-05 20:52:322024-10-05 20:52:32

Judging History

This is the latest submission verdict.

  • [2024-10-05 20:52:32]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 3596kb
  • [2024-10-05 20:52:32]
  • Submitted

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;
}

Details

Tip: Click on the bar to expand more detailed information

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'