답안 #250351

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
250351 2020-07-17T13:34:07 Z oolimry Building Bridges (CEOI17_building) C++14
100 / 100
117 ms 26616 KB
#include <bits/stdc++.h>
#define m first
#define c second;
using namespace std;
typedef pair<long long,long long> line;

const long long inf = 102345678901234567;

long long get(line L, int x){ return L.m * x + L.c; }

long long H[100005];
int C[100005];

struct lichao{
	int s, e, m;
	lichao *l = nullptr, *r = nullptr;
	line val = line(0,inf);
	
	lichao(int S, int E){
		s = S, e = E, m = (s+e)/2;
	}
	
	void create(){
		l = new lichao(s, m);
		r = new lichao(m, e);
	}
	
	void insert(line L){
		if(get(L, m) < get(val, m)) swap(L, val); ///make val the dominant one
		
		if(s == e-1) return;
		
		if(l == nullptr) create();
		
		if(get(L, s) < get(val, s)) l->insert(L); ///L has some chance in l
		else r->insert(L); ///L has some chance in r
	}
	
	long long query(int x){
		if(s == e-1) return get(val, x);
		else{
			if(l == nullptr) create();
			
			if(x >= m) return min(get(val,x), r->query(x));
			else return min(get(val,x), l->query(x));
		}
	}
	
} *root;

signed main(){
	ios_base::sync_with_stdio(false);
	
	long long ans = 0;
	
	int n; cin >> n;
	for(int i = 0;i < n;i++) cin >> H[i];
	for(int i = 0;i < n;i++){
		cin >> C[i];
		ans += C[i];
		C[i] *= -1;
	}
	
	root = new lichao(0, 1000001);
	
	long long dp = C[0];
	root->insert(line(-2*H[0], dp + H[0]*H[0]));
	
	for(int i = 1;i < n;i++){
		dp = root->query(H[i]);
		dp += H[i]*H[i] + C[i];
		
		root->insert(line(-2*H[i], dp + H[i]*H[i]));
		
	}
	cout << dp + ans << "\n";
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 1 ms 512 KB Output is correct
5 Correct 1 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 62 ms 2560 KB Output is correct
2 Correct 56 ms 2552 KB Output is correct
3 Correct 58 ms 2552 KB Output is correct
4 Correct 51 ms 1792 KB Output is correct
5 Correct 71 ms 18808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 1 ms 512 KB Output is correct
5 Correct 1 ms 512 KB Output is correct
6 Correct 62 ms 2560 KB Output is correct
7 Correct 56 ms 2552 KB Output is correct
8 Correct 58 ms 2552 KB Output is correct
9 Correct 51 ms 1792 KB Output is correct
10 Correct 71 ms 18808 KB Output is correct
11 Correct 100 ms 13268 KB Output is correct
12 Correct 117 ms 13304 KB Output is correct
13 Correct 53 ms 1912 KB Output is correct
14 Correct 101 ms 13304 KB Output is correct
15 Correct 69 ms 26616 KB Output is correct
16 Correct 66 ms 18808 KB Output is correct
17 Correct 40 ms 1536 KB Output is correct
18 Correct 42 ms 1536 KB Output is correct