답안 #306847

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
306847 2020-09-26T10:53:51 Z miss_robot Building Bridges (CEOI17_building) C++14
100 / 100
160 ms 10616 KB
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int INF = 1e9;

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

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

int qry(int x, set<segment> &s){
	auto it = --s.upper_bound({x, 0, 0, 0, 0});
	return it->m * x + it->a;
}

void upd(int m, int a, set<segment> &s){
	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 = s.end();
	else{
		st--;
		while(isect(m, a, st->m, st->a) < st->r){
			double tmp = isect(m, a, st->m, st->a);
			if(tmp < st->l) st = --s.erase(st);
			else st->r = floor(tmp);
		}
	}
	auto en = s.upper_bound({0, 0, m, 0, 1});
	while(en != s.end() && isect(m, a, en->m, en->a) > en->l){
		double tmp = isect(m, a, en->m, en->a);
		if(tmp > en->r) en = s.erase(en);
		else en->l = ceil(tmp);
	}
	if(st == s.end() || en == s.end() || st->r+1 < en->l)
		s.insert({(st==s.end()?-INF:st->r+1), (en==s.end()?INF:en->l-1), m, a, 0});
}

signed main(){
	int n;
	cin >> n;
	vector<int> h(n), w(n);
	for(int &x : h) cin >> x;
	for(int &x : w) cin >> x;
	w[0] = 0;
	for(int i = 1; i < n-1; i++) w[i] += w[i-1];
	set<segment> s;
	upd(-2*h[0], h[0]*h[0], s);
	for(int i = 1; i < n-1; i++)
		upd(-2*h[i], h[i]*h[i]-w[i]+qry(h[i], s)+h[i]*h[i]+w[i-1], s);
	cout << qry(h[n-1], s)+h[n-1]*h[n-1]+w[n-2] << "\n";
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 256 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 151 ms 3064 KB Output is correct
2 Correct 149 ms 3064 KB Output is correct
3 Correct 147 ms 3064 KB Output is correct
4 Correct 138 ms 2808 KB Output is correct
5 Correct 133 ms 4476 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 256 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
6 Correct 151 ms 3064 KB Output is correct
7 Correct 149 ms 3064 KB Output is correct
8 Correct 147 ms 3064 KB Output is correct
9 Correct 138 ms 2808 KB Output is correct
10 Correct 133 ms 4476 KB Output is correct
11 Correct 153 ms 3064 KB Output is correct
12 Correct 150 ms 3064 KB Output is correct
13 Correct 129 ms 3064 KB Output is correct
14 Correct 160 ms 3192 KB Output is correct
15 Correct 145 ms 10616 KB Output is correct
16 Correct 133 ms 4344 KB Output is correct
17 Correct 107 ms 2936 KB Output is correct
18 Correct 107 ms 2936 KB Output is correct