社区讨论
BZOJ上面A了但是luogu最后一个点WA?不知道原因
P3194[HNOI2008] 水平可见直线参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi6nmumz
- 此快照首次捕获于
- 2025/11/20 07:49 4 个月前
- 此快照最后确认于
- 2025/11/20 07:49 4 个月前
在洛谷上显示
CPPtoo many or too few lines
应该是转化再作没问题把。#include <bits/stdc++.h>
#define MAX_N 50010
typedef long long ll;
using namespace std;
struct p {int x, y, id;}a[MAX_N];
int N, q[MAX_N], rear;
bool operator < (p a, p b) {return a.x == b.x ? a.y < b.y : a.x < b.x;}
p operator - (p a, p b) {return (p){a.x - b.x, a.y - b.y};}
double /*这里和下面变成long long也一样*/ cross (p a, p b) {return 1LL * a.x * b.y - 1LL * b.x * a.y;}
double check (p a, p b, p c) {return cross((b - a), (c - a));}
int main () {
scanf("%d", &N);
for (int i = 1;i <= N; ++i) scanf("%d%d", &a[i].x, &a[i].y), a[i].id = i, a[i].y *= -1;
sort(a + 1, a + N + 1);
//for (int i = 1;i <= N; ++i) printf("k:%d b:%d id:%d\n", a[i].x, a[i].y, a[i].id);
for (int i = 1;i <= N; ++i) if (a[i].x != a[i - 1].x) {
while (rear > 1 && check(a[q[rear - 1]], a[q[rear]], a[i]) <= 0) rear--;
q[++rear] = i;
}
for (int i = 1;i <= rear; ++i) q[i] = a[q[i]].id;
sort(q + 1, q + rear + 1);
for (int i = 1;i <= rear; ++i) printf("%d ", q[i]); printf("\n");
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...