博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018杭电多校第三场1007(凸包,极角排序)
阅读量:7030 次
发布时间:2019-06-28

本文共 1289 字,大约阅读时间需要 4 分钟。

#include<bits/stdc++.h>

using namespace std;
typedef const long long ll;
struct node
{
    int x,y;
    int pos;
}plane[200020],tubao[200020],stt;
int top;
int n;
long long multi(node a,node b,node c)
{
    ll mianji=1ll*(a.x-c.x)*(b.y-c.y)-1ll*(a.y-c.y)*(b.x-c.x);//面积公式判断正负值
    return mianji;
}
bool cmp(node a,node b)
{
    if(a.x==b.x&&a.y==b.y)
        return a.pos>b.pos;//重复点,字典序大的排在前(此处如果将字典序小的排在前,则WA,原因未知)
    if(!multi(stt,b,a))//两个点与原点的连线斜率相等,即三点共线
        return pow(a.x-stt.x,2)+pow(a.y-stt.y,2)<pow(b.x-stt.x,2)+pow(b.y-stt.y,2);
        //和原点距离近的排在前
    return multi(stt,b,a)>0;//multi为正说明联接凸包的顺序a在b之前(a在b下面如果纵坐标相等a横坐标更小)
}
void graham()
{
    tubao[1]=plane[1];
    tubao[2]=plane[2];
    top=3;
    for(int i=3;i<=n;i++)
    {
        while(top>2&&multi(tubao[top-2],plane[i],tubao[top-1])<=0)
        {
            if(multi(tubao[top-2],plane[i],tubao[top-1])<0||plane[i].pos<tubao[top-1].pos)//处理字典序问题
                //该点应在栈中第二点之前联接凸包或者和第二点重合然而字典序靠前
                top--;
            else
                break;
        }
        tubao[top++]=plane[i];//用栈模拟联接凸包顺序
    }
    for(int i=1;i<top;i++)
    {
        printf("%d%c",tubao[i].pos,i==top-1?'\n':' ');
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int x,y;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&y);
            plane[i].x=x;
            plane[i].y=y;
            plane[i].pos=i;
        }
        stt=plane[1];
        sort(plane+2,plane+1+n,cmp);//起点不参与排序
        graham();
    }
    return 0;
}

//坐标排序待补

转载于:https://www.cnblogs.com/ldudxy/p/9528928.html

你可能感兴趣的文章
Git 操作分支
查看>>
Grid search in the tidyverse
查看>>
hdu 三部曲 Contestants Division
查看>>
day22——创建表、增加数据、查询数据
查看>>
css伪元素实现tootip提示框
查看>>
关于函数指针的总结
查看>>
采用PHP函数uniqid生成一个唯一的ID
查看>>
Centos7安装32位库用来安装32位软件程序
查看>>
【HMOI】小C的填数游戏 DP+线段树维护
查看>>
java中23种设计模式之6-适配器模式(adapter pattern)
查看>>
Easy C 编程 in Linux
查看>>
poj3761(反序表)
查看>>
x86寄存器总结
查看>>
jquery easyui ajax data属性传值方式
查看>>
封装了些文件相关的操作
查看>>
什么是Solr
查看>>
poj2386(简单dfs)
查看>>
双链表的基本操作
查看>>
走进异步编程的世界 - 剖析异步方法(上)
查看>>
[HAOI2006]受欢迎的牛
查看>>