关于用凸包解决点nd.x>nd1.x||nd.y>nd1.y(nd1为平面任意点)
我太蒻了,一开始想不到使用优先队列
本题是否可以理解为凸包上凸壳中斜率小于零线段的端点。可是蒟蒻的我不确定是否正确,因为写挂了
有没有巨佬帮忙看看(
#include <bits/stdc++.h>
using namespace std;
inline int read() {
int x,f;char ch;
for(f=0;!isdigit(ch=getchar());f=ch=='-');
for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
return f?-x:x;
}
long long st[500001],sum;
struct node {
long long x,y;
long long operator *(const node &ls) const {
return x*ls.y-y*ls.x;
}
node operator -(const node &ls) const {
node k;
k.x=x-ls.x;k.y=y-ls.y;
return k;
}
bool operator <(const node &ls) const {
return x!=ls.x ? x<ls.x : y>ls.y;
}
}nd[500001];
long long n=read(),ans[500001],sm=1;
int main() {
for(int i=1;i<=n;i++) nd[i].x=read(),nd[i].y=read();
sort(nd+1,nd+n+1);
st[sum++]=n;
for(int i=n-1;i>=1;i--) {
while(sum>=2 && (nd[i]-nd[st[sum-1]])*(nd[st[sum-1]]-nd[st[sum-2]])>0) sum--;
st[sum++]=i;
}
// for(int i=0;i<sum;i++) printf("%d %d\n",nd[st[i]].x,nd[st[i]].y);
// putchar('\n');
ans[1]=st[0];
for(int i=1;i<sum;i++) {
if(nd[st[i]].x<=nd[st[i-1]].x && nd[st[i]].y<=nd[st[i-1]].y) break;
ans[++sm]=st[i];
}
printf("(%d,%d)",nd[ans[sm]].x,nd[ans[sm]].y);
for(int i=sm-1;i>=1;i--) {
printf(",(%d,%d)",nd[ans[i]].x,nd[ans[i]].y);
}
return 0;
}