답안 #153192

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
153192 2019-09-12T20:42:40 Z gs18103 먼 별 (KOI16_dist) C++14
2 / 100
161 ms 3416 KB
#include <bits/stdc++.h>
#define x first
#define y second
 
using namespace std;
typedef long long ll;
typedef pair <ll, ll> pll;
 
ll arr[30303][4];
pll base;
int n, T;

ll ccw(pll a, pll b, pll c) {
	return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}

ll dis(pll a, pll b) {
	return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}

ll cal_dis(int t) {
	vector <pll> p, ch;
	for(int i = 0; i < n; i++) {
		p.emplace_back(arr[i][0] + arr[i][2] * t, arr[i][1] + arr[i][3] * t);
	}
	sort(p.begin(), p.end());
	base = p[0];
	sort(p.begin()+1, p.end(), [](pll a, pll b) {
		return ccw(base, a, b) > 0;
	});
	ch.emplace_back(base);
	for(int i = 1; i < n; i++) {
		while(ch.size() >= 2) {
			pll p1 = ch[ch.size()-2], p2 = ch[ch.size()-1];
			if(ccw(p1, p2, p[i]) > 0) break;
			ch.pop_back();
		}
		ch.emplace_back(p[i]);
	}

	int idx = 1;
	ll ret = 0;
	for(int i = 0; i < ch.size(); i++) {
		while(idx+1 < ch.size() && dis(ch[i], ch[idx]) < dis(ch[i], ch[idx+1])) idx++;
		ret = max(ret, dis(ch[i], ch[idx]));
	}
	return ret;
}

int search(int s, int e) {
	if(s + 5 >= e) 	{
		ll dis = 10000000000000000LL;
		for(int i = s; i <= e; i++) {
			dis = min(dis, cal_dis(i));
		}
		for(int i = s; i <= e; i++) {
			if(dis == cal_dis(i)) return i;
		}
	}
	int t1 = (2 * s + e) / 3, t2 = (s + 2 * e) / 3;
	ll dis1 = cal_dis(t1), dis2 = cal_dis(t2);
	if(dis1 <= dis2) return search(s, t2);
	else return search(t1, e);
}
 
int main() {
	ios::sync_with_stdio(false); cin.tie(0);
	cin >> n >> T;
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < 4; j++) {
			cin >> arr[i][j];
		}
	}
	int ans = search(0, T);
	cout << ans << '\n' << cal_dis(ans);
}

Compilation message

dist.cpp: In function 'll cal_dis(int)':
dist.cpp:43:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < ch.size(); i++) {
                 ~~^~~~~~~~~~~
dist.cpp:44:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(idx+1 < ch.size() && dis(ch[i], ch[idx]) < dis(ch[i], ch[idx+1])) idx++;
         ~~~~~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
7 Correct 2 ms 376 KB Output is correct
8 Correct 2 ms 376 KB Output is correct
9 Correct 2 ms 376 KB Output is correct
10 Correct 2 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
7 Correct 2 ms 376 KB Output is correct
8 Correct 2 ms 376 KB Output is correct
9 Correct 2 ms 376 KB Output is correct
10 Correct 2 ms 376 KB Output is correct
11 Correct 15 ms 504 KB Output is correct
12 Incorrect 14 ms 504 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 161 ms 3176 KB Output is correct
2 Correct 135 ms 2832 KB Output is correct
3 Correct 131 ms 3008 KB Output is correct
4 Incorrect 100 ms 3416 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
7 Correct 2 ms 376 KB Output is correct
8 Correct 2 ms 376 KB Output is correct
9 Correct 2 ms 376 KB Output is correct
10 Correct 2 ms 376 KB Output is correct
11 Correct 15 ms 504 KB Output is correct
12 Incorrect 14 ms 504 KB Output isn't correct
13 Halted 0 ms 0 KB -