답안 #486274

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
486274 2021-11-11T05:12:14 Z ez_ioi Building Bridges (CEOI17_building) C++17
100 / 100
66 ms 9776 KB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int mxN = 1e6 + 5, mod = 1e9 + 7, LOG = 20;

int n, h[mxN], w[mxN];

ll p[mxN], dp[mxN];

struct Line {
	mutable ll k, m, p;
	bool operator<(const Line& o) const { return k < o.k; }
	bool operator<(ll x) const { return p < x; }
};
 
struct LineContainer : multiset<Line, less<>> {
	static const ll inf = LLONG_MAX;
	ll div(ll a, ll b) { 
		return a / b - ((a ^ b) < 0 && a % b); }
	bool isect(iterator x, iterator y) {
		if (y == end()) return x->p = inf, 0;
		if (x->k == y->k) x->p = x->m > y->m ? inf : -inf;
		else x->p = div(y->m - x->m, x->k - y->k);
		return x->p >= y->p;
	}
	void add(ll k, ll m) {
		auto z = insert({k, m, 0}), y = z++, x = y;
		while (isect(y, z)) z = erase(z);
		if (x != begin() && isect(--x, y)) isect(x, y = erase(y));
		while ((y = x) != begin() && (--x)->p >= y->p)
			isect(x, erase(y));
	}
	ll query(ll x) {
		assert(!empty());
		auto l = *lower_bound(x);
		return l.k * x + l.m;
	}
};
 
LineContainer line;

int main() {
	ios :: sync_with_stdio(false), cin.tie(nullptr);
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> h[i];
	for (int i = 1; i <= n; ++i) cin >> w[i], p[i] = p[i - 1] + w[i];
	line.add(2 * h[1], -(h[1] * 1ll * h[1] - p[1]));
	for (int i = 2; i <= n; ++i) {
		dp[i] = h[i] * 1ll * h[i] + p[i - 1] + (-line.query(h[i]));
		line.add(2 * h[i], -(h[i] * 1ll * h[i] - p[i] + dp[i]));
	} 
	cout << dp[n];
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 0 ms 332 KB Output is correct
4 Correct 1 ms 332 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 36 ms 3728 KB Output is correct
2 Correct 37 ms 3736 KB Output is correct
3 Correct 44 ms 3720 KB Output is correct
4 Correct 34 ms 3608 KB Output is correct
5 Correct 34 ms 4780 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 0 ms 332 KB Output is correct
4 Correct 1 ms 332 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 36 ms 3728 KB Output is correct
7 Correct 37 ms 3736 KB Output is correct
8 Correct 44 ms 3720 KB Output is correct
9 Correct 34 ms 3608 KB Output is correct
10 Correct 34 ms 4780 KB Output is correct
11 Correct 36 ms 3896 KB Output is correct
12 Correct 38 ms 3652 KB Output is correct
13 Correct 31 ms 3784 KB Output is correct
14 Correct 37 ms 3912 KB Output is correct
15 Correct 66 ms 9776 KB Output is correct
16 Correct 34 ms 4804 KB Output is correct
17 Correct 21 ms 3728 KB Output is correct
18 Correct 21 ms 3780 KB Output is correct