HDU 6325 Problem G. Interstellar Travel(上凸包)
程序员文章站
2022-03-30 08:38:59
...
Description
给出个二维点的坐标,要求从第一个点出发经过若干点到达最后一个点使得代价最小,从点到需要满足,代价为,要求选择字典序最小的点集使得代价最小
Input
第一行一整数表示用例组数, 每组用例首先输入一整数表示点数,之后行每行输入两个整数表示第个点的横纵坐标
Output
输出所选点集
Sample Input
1
3
0 0
3 0
4 0
Sample Output
1 2 3
Solution
显然分值和为所选点集构成的多边形面积,故选取上凸包上的点即可,由于结果要字典序最小,故要注意点共线的情况和重点的情况,因为此时凸包不是完全凸的,那么重点会影响凸性
Code
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
#define maxn 200005
struct Point
{
int x,y,id;
Point(){};
Point(int _x,int _y,int _id)
{
x=_x,y=_y,id=_id;
}
Point operator-(const Point &b)const
{
return Point(x-b.x,y-b.y,0);
}
ll operator^(const Point &b)const
{
return 1ll*x*b.y-1ll*y*b.x;
}
bool operator<(const Point &b)const
{
if(x!=b.x)return x<b.x;
if(y!=b.y)return y<b.y;
return id<b.id;
}
}p[maxn],s[maxn];
int T,n;
void convex_hull()
{
int top=0;
for(int i=1;i<=n;i++)
{
if(i>1&&p[i].x==p[i-1].x&&p[i].y==p[i-1].y)continue;
while(top>1&&((s[top-1]-s[top-2])^(p[i]-s[top-1]))>0)top--;
while(top>1&&((s[top-1]-s[top-2])^(p[i]-s[top-1]))==0&&s[top-1].id>p[i].id)top--;
s[top++]=p[i];
}
for(int i=0;i<top;i++)
printf("%d%c",s[i].id,i==top-1?'\n':' ');
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
p[i].id=i;
}
sort(p+1,p+n+1);
convex_hull();
}
return 0;
}
下一篇: Github-Markdown语法
推荐阅读
-
2018 Multi-University Training Contest 3 1007 / hdu6325 Problem G. Interstellar Travel 凸包
-
2018 Multi-University Training Contest 3 &&HDU6325 Interstellar Travel【凸包】
-
2018多校第3场 G题 && HDU6325 Problem G. Interstellar Travel
-
HDU 6325 Interstellar Travel(凸包)
-
HDU 6325 Problem G. Interstellar Travel(上凸包)
-
HDU 6325 Interstellar Travel 【凸包+单调栈】
-
hdu6325 Problem G. Interstellar Travel
-
HDU 6325 Interstellar Travel【凸包】
-
hdu 6325 Interstellar Travel (凸包)
-
HDU-6325 Interstellar Travel(几何...上凸包)