萌新刚学OI,求助旋转卡壳
  • 板块学术版
  • 楼主KokiNiwa
  • 当前回复7
  • 已保存回复7
  • 发布时间2020/7/3 12:06
  • 上次更新2023/11/6 23:44:23
查看原帖
萌新刚学OI,求助旋转卡壳
75715
KokiNiwa楼主2020/7/3 12:06
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 5e4 + 5;
struct dot {
	int x, y;
	dot(int _x = 0, int _y = 0) : x(_x), y(_y) {}
	dot operator-(const dot &d) const { return dot(x - d.x, y - d.y); }
	int operator*(const dot &d) const { return x * d.y - y * d.x; }
	bool operator<(const dot &d) const { return (x == d.x) ? (y > d.y) : (x < d.x); }
} dt[N];
int dis(dot a, dot b) { return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); }
int n, stk[N];
bool use[N];
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i)
		scanf("%d%d", &dt[i].x, &dt[i].y);
	sort(dt + 1, dt + n + 1);
	int tp = 0;
	for (int i = 1; i <= n; ++i) {
		while (tp >= 2 && (dt[stk[tp - 1]] - dt[stk[tp]]) * (dt[stk[tp]] - dt[i]) > 0) {
			use[stk[tp]] = 0;
			--tp;
		}
		use[i] = 1;
		stk[++tp] = i;
	}
	use[1] = 0;
	int rec = tp;
	for (int i = 1; i <= n; ++i) {
		if (use[i]) continue ;
		while (tp > rec && (dt[stk[tp - 1]] - dt[stk[tp]]) * (dt[stk[tp]] - dt[i]) > 0)
			--tp;
		stk[++tp] = i;
	}
	--tp;
	int ans = 0, pt = 1;
	for (int i = 1; i <= tp; ++i) {
		while (dis(dt[stk[i]], dt[stk[pt % tp + 1]]) >= dis(dt[stk[i]], dt[stk[pt]]))
			pt = pt % tp + 1;
		ans = max(dis(dt[stk[i]], dt[stk[pt]]), ans);
	}
	printf("%d\n", ans);
	return 0;
}

莫名68分...

2020/7/3 12:06
加载中...