社区讨论

BZOJ上面A了但是luogu最后一个点WA?不知道原因

P3194[HNOI2008] 水平可见直线参与者 4已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi6nmumz
此快照首次捕获于
2025/11/20 07:49
4 个月前
此快照最后确认于
2025/11/20 07:49
4 个月前
查看原帖
在洛谷上显示too many or too few lines 应该是转化再作没问题把。
CPP
#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 条回复,欢迎继续交流。

正在加载回复...