社区讨论
求hack
学术版参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m4b4l3mk
- 此快照首次捕获于
- 2024/12/05 17:39 去年
- 此快照最后确认于
- 2025/11/04 13:19 4 个月前
旋转卡壳 虽然通过了,但是觉得会被 hack 。具体在第 48 行,会不会有存在前面的决策点更好的情况呢?构造一组 hack 或是证明不会出现这样的情况?
CPP#include <iostream>
#include <algorithm>
using namespace std;
#define MAX_N 50010
#define PII pair<int, int>
#define x first
#define y second
PII operator- (PII a, PII b) {
return { a.x - b.x, a.y - b.y };
}
int cross(PII a, PII b) {
return a.x * b.y - a.y * b.x;
}
int area(PII a, PII b, PII c) {
return cross(b - a, c - a);
}
int n, top = 0;
int stack[MAX_N << 1] = { 0 };
bool vis[MAX_N] = { 0 };
PII pos[MAX_N];
void convex_hull() {
sort(pos + 1, pos + 1 + n);
for (int i = 1; i <= n; i++) {
while(top >= 2 && area(pos[stack[top - 1]], pos[stack[top]], pos[i]) < 0)
vis[stack[top--]] = false;
vis[i] = true;
stack[++top] = i;
}
vis[1] = false;
for (int i = n; i; i--) {
if (vis[i]) continue;
while(top >= 2 && area(pos[stack[top - 1]], pos[stack[top]], pos[i]) < 0)
vis[stack[top--]] = false;
vis[i] = true;
stack[++top] = i;
}
top--;
}
int dis(PII a, PII b) {
int dx = a.x - b.x;
int dy = a.y - b.y;
return dx * dx + dy * dy;
}
int solve() {
int ret = dis(pos[1], pos[n]);
for (int i = 1, j = 3; i <= top; i++) {
PII a = pos[stack[i]], b = po6s[stack[i + 1]];
while (area(a, b, pos[stack[j]]) < area(a, b, pos[stack[j + 1]]))
j = j + 1 > top ? 1 : j + 1;
ret = max(ret, dis(a, pos[stack[j]]));
ret = max(ret, dis(b, pos[stack[j]]));
}
return ret;
}
int main() {
scanf("%d", &n);
for (int x = 1; x <= n; x++) scanf("%d%d", &pos[x].x, &pos[x].y);
convex_hull();
printf("%d", solve());
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...