Submission #384241

#TimeUsernameProblemLanguageResultExecution timeMemory
384241wind_reaperBuilding Bridges (CEOI17_building)C++17
100 / 100
51 ms6124 KiB
#include <bits/stdc++.h>

using namespace std;

template<typename T>
struct LiChaoTree{
	static const T identity = numeric_limits<T>::max();

	struct Line{
		T m, c;

		Line(){
			m = 0;
			c = identity;
		}

		Line(T m, T c) : m(m), c(c) {}

		T val(T x){
			return m*x + c;
		}
	};

	struct Node{
		Node *lc, *rc;
		Line line;

		Node() : lc(0), rc(0) {}
	};

	deque<Node> buffer;

	Node* new_node(){
		buffer.emplace_back();
		return &buffer.back();
	}

	Node *root;

	T L, R;
	LiChaoTree(T L, T R){
		this->L = L;
		this->R = R;

		root = new_node();
	}

	void insert(Node* &node, T l, T r, Line line){
		if(!node){
			node = new_node();
			node->line = line;
			return;
		}

		if(r - l == 1)
			return;

		T mid = (l + r) >> 1;
		
		if(line.val(mid) < node->line.val(mid))
			swap(line, node->line);

		if(line.val(l) < node->line.val(l)) insert(node->lc, l, mid, line);
		else insert(node->rc, mid, r, line);
	}

	T query(Node* &node, T l, T r, T x){
		if(!node)
			return identity;

		T mid = (l + r) >> 1;
		T res = node->line.val(x);

		if(r - l == 1)
			return res;

		if(x < mid) return min(res, query(node->lc, l, mid, x));
		else return min(res, query(node->rc, mid, r, x));
	}

	void insert(T m, T c) { insert(root, L, R, Line(m, c)); }
	T query(T x) { return query(root, L, R, x); }
};

int32_t main(){
	ios_base::sync_with_stdio(false); 
	cin.tie(NULL); 
		
	int n;
	cin >> n; 
 
	vector<int64_t> h(n+1), w(n+1);
	for(int i = 1; i <= n; i++)
		cin >> h[i];

	int64_t sum = 0; 
	for(int i = 1; i <= n; i++){
		cin >> w[i];
		sum += w[i];
	}

	LiChaoTree<int64_t> dp(1, 1000001);
	dp.insert(-2*h[1], h[1]*h[1] - w[1]);

	int64_t ans = 0;
	for(int i = 2; i <= n; i++){
		int64_t temp = dp.query(h[i]) + h[i]*h[i] - w[i];
		dp.insert(-2*h[i], temp + h[i]*h[i]);
		if(i == n) ans = temp;
	}

	cout << ans + sum << '\n';
	return 0; 
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...