이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> pi;
#define f first
#define s second
#define FAST ios_base::sync_with_stdio(0); cin.tie(0);
const int maxn = 1000010;
#define ld long double
deque <pi> dq;
int n;
int T[maxn];
int jump[maxn];
int f(pi line, int x) {
	return line.f * x + line.s;
}
int query(int x) {
	while (dq.size() > 1) {
		if (f(dq[0],x) > f(dq[1],x)) dq.pop_front();
		else break;
	}
	return f(dq[0],x);
}
ld intersect(pi p1, pi p2) {
	return (ld) (p2.s - p1.s) / (p1.f - p2.f);
}
void insert(int m, int c) {
	pi line = pi(m,c);
	int s = dq.size();
	while (s > 1) {
		if (intersect(dq[s-1],line) <= intersect(dq[s-2],line)) dq.pop_back();
		else break;
		s = dq.size();
	}
	dq.push_back(line);
}
int32_t main() {
	FAST
	cin >> n;
	for (int i =1;i<=n;i++) cin >> T[i];
	
	pi curmax = pi(0,0);
	for (int i =1;i<=n;i++) {
		if (T[i] > curmax.f) {
			jump[i] = curmax.s;
			curmax = pi(T[i],i);
		}
	}
	
	int curx = curmax.s;
	insert(T[curx], 0);
	
	int bestprev = query(n - curx + 1);
	curx = jump[curx];
	
	while (curx != 0) {
		//cout << curx << " " << T[curx] << " " << bestprev << "\n";
		insert(T[curx], bestprev);
		bestprev = query((n - curx + 1));
		curx = jump[curx];
	}
	cout << bestprev;
	
}
| # | 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... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |