社区讨论

求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 条回复,欢迎继续交流。

正在加载回复...