首页 > 其他 > 详细

[BZOJ1007][HNOI2008]水平可见直线-[凸包]

时间:2018-08-22 21:18:17      阅读:154      评论:0      收藏:0      [点我收藏+]

Description

传送门

Solution

直接凸包,可见我们要求下凸包,又因为凸包的构成直线k是递减的,直接排个序按套路走。

感觉数据好水。。一份AC代码我自己手动出的数据都有bug。。然后我就加了一些小处理把我自己挑的bug给改了。(em这波操作)

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,top,ans[500010];
struct node{int k,b,id;
}y[500010],st[500010];
bool cmp(node a,node b){return (a.k==b.k)?a.b<b.b:a.k<b.k;}
bool X(node a,node b,node c)
{return 1.0*(a.b-b.b)*(c.k-a.k)>=1.0*(a.b-c.b)*(b.k-a.k);}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d",&y[i].k,&y[i].b);
        y[i].id=i;
    } 
    sort(y+1,y+n+1,cmp);
    st[top=1]=y[1];
    int now=1;
    for (;y[now+1].k==st[top].k;st[top]=y[now+1],now++);
    for (int i=now+1;i<=n;i++)
    {
        while (top>1&&X(st[top-1],st[top],y[i])) top--;
        st[++top]=y[i];
    }
    for (int i=1;i<=top;i++) ans[i]=st[i].id;
    sort(ans+1,ans+top+1);
    for (int i=1;i<=top;i++) printf("%d ",ans[i]);
}

 

[BZOJ1007][HNOI2008]水平可见直线-[凸包]

原文:https://www.cnblogs.com/coco-night/p/9520325.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!