Submission #113896

# Submission time Handle Problem Language Result Execution time Memory
113896 2019-05-29T06:17:01 Z Mahdi_Jfri Building Bridges (CEOI17_building) C++14
100 / 100
68 ms 9028 KB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back

bool Q;
struct Line {
	mutable ll k, m, p;
	bool operator<(const Line& o) const {
		return Q ? p < o.p : k < o.k;
	}
};

struct LineContainer : multiset<Line> {
	// (for doubles, use inf = 1/.0, div(a,b) = a/b)
	const ll inf = LLONG_MAX;
	ll div(ll a, ll b) { // floored division
		return a / b - ((a ^ b) < 0 && a % b); }
	bool isect(iterator x, iterator y) {
		if (y == end()) { x->p = inf; return false; }
		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());
		Q = 1; auto l = *lower_bound({0,0,x}); Q = 0;
		return l.k * x + l.m;
	}
};

LineContainer cht;

const int maxn = 1e5 + 20;

ll dp[maxn];

int h[maxn] , w[maxn];

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int n;
	cin >> n;

	for(int i = 0; i < n; i++)
		cin >> h[i];

	ll sum = 0;
	for(int i = 0; i < n; i++)
		cin >> w[i] , sum += w[i];

	for(int i = 0; i < n; i++)
	{
		if(!i)
			dp[0] = -w[0];
		else
			dp[i] = 1LL * h[i] * h[i] - cht.query(h[i]) - w[i];

		cht.add(2 * h[i] , -dp[i] - 1LL * h[i] * h[i]);
	}

	cout << dp[n - 1] + sum << endl;
}






# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 3 ms 384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 47 ms 1912 KB Output is correct
2 Correct 47 ms 3064 KB Output is correct
3 Correct 49 ms 3064 KB Output is correct
4 Correct 42 ms 2936 KB Output is correct
5 Correct 43 ms 3960 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 3 ms 384 KB Output is correct
6 Correct 47 ms 1912 KB Output is correct
7 Correct 47 ms 3064 KB Output is correct
8 Correct 49 ms 3064 KB Output is correct
9 Correct 42 ms 2936 KB Output is correct
10 Correct 43 ms 3960 KB Output is correct
11 Correct 46 ms 3192 KB Output is correct
12 Correct 47 ms 3064 KB Output is correct
13 Correct 37 ms 3064 KB Output is correct
14 Correct 47 ms 3192 KB Output is correct
15 Correct 68 ms 9028 KB Output is correct
16 Correct 40 ms 4088 KB Output is correct
17 Correct 25 ms 2936 KB Output is correct
18 Correct 26 ms 2936 KB Output is correct