답안 #305137

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
305137 2020-09-22T15:44:25 Z miss_robot Building Bridges (CEOI17_building) C++14
100 / 100
83 ms 11384 KB
#include <bits/stdc++.h>

#pragma GCC optimize("O3")
#define int long long

using namespace std;

const int N = 1e5, INF = 1e12;
int n;
int dp[N], p[N], h[N];

struct segment{
	mutable int l, r;
	int m, a, mode;
	bool operator<(const segment &o) const{
		if(mode || o.mode) return m > o.m;
		return l < o.l;
	}
}; set<segment> s;

int qry(int x){
	segment t = *--s.upper_bound({x, 0, 0, 0, 0});
	return x*t.m + t.a;
}

double isect(int m1, int m2, int a1, int a2){
	return (double)(a1-a2)/(double)(m2-m1);
}

void upd(int m, int a){
	auto st = s.lower_bound({0, 0, m, 0, 1});
	if(st != s.end() && st->m == m){
		if(st->a < a) return;
		st = s.erase(st);
	}
	if(st != s.begin()){
		st--;
		while(isect(m, st->m, a, st->a) < st->r){
			double x = isect(m, st->m, a, st->a);
			if(x <= st->l) st = --s.erase(st);
			else st->r = floor(x);
		}
	}
	else st = s.end();
	auto en = s.upper_bound({0, 0, m, 0, 1});
	while(en != s.end() && isect(m, en->m, a, en->a) > en->l){
		double x = isect(m, en->m, a, en->a);
		if(x >= en->r) en = s.erase(en);
		else en->l = ceil(x);
	}
	if(st == s.end() || en == s.end() || en->l-st->r > 1)
		s.insert({st == s.end()? -INF:st->r+1, en == s.end()? INF:en->l-1, m, a, 0});
}

signed main(){
	cin.tie(0);
	ios::sync_with_stdio(0);
	cin >> n;
	for(int i = 0; i < n; i++) cin >> h[i];
	for(int i = 0; i < n; i++){
		cin >> p[i];
		if(i) p[i] += p[i-1];
	}
	upd(-2*h[0], h[0]*h[0]-p[0]);
	for(int i = 1; i < n; i++){
		dp[i] = qry(h[i]) + h[i]*h[i] + p[i-1];
		upd(-2*h[i], dp[i] + h[i]*h[i] - p[i]);
	}
	cout << dp[n-1] << "\n";
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 74 ms 3832 KB Output is correct
2 Correct 77 ms 3832 KB Output is correct
3 Correct 74 ms 3832 KB Output is correct
4 Correct 66 ms 3640 KB Output is correct
5 Correct 69 ms 5112 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 74 ms 3832 KB Output is correct
7 Correct 77 ms 3832 KB Output is correct
8 Correct 74 ms 3832 KB Output is correct
9 Correct 66 ms 3640 KB Output is correct
10 Correct 69 ms 5112 KB Output is correct
11 Correct 63 ms 3960 KB Output is correct
12 Correct 71 ms 3832 KB Output is correct
13 Correct 51 ms 3916 KB Output is correct
14 Correct 76 ms 3936 KB Output is correct
15 Correct 83 ms 11384 KB Output is correct
16 Correct 75 ms 5064 KB Output is correct
17 Correct 29 ms 3704 KB Output is correct
18 Correct 21 ms 3712 KB Output is correct