码迷,mamicode.com
首页 > 其他好文 > 详细

[日常摸鱼]bzoj1007[HNOI2008]水平可见直线-半平面交(对偶转凸包)

时间:2018-01-21 12:38:20      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:bzoj1007   tar   平面   span   long   body   opera   operator   oss   

不会写半平面交…然后发现可以转成对偶凸包问题

具体见这里:http://trinkle.blog.uoj.ac/blog/235

相关的原理我好像还是不太懂…orz

#include<cstdio>
#include<algorithm>
const int N=50005;
inline int read()
{
    int s=0,f=1;char c=getchar();
    while(c<0||c>9){if(c==-)f=-1;c=getchar();}
    while(c>=0&&c<=9){s=s*10+c-0;c=getchar();}
    return s*f;
}
struct P{int x,y,i;}p[N];
int n,r,s[N];
bool cmp(P a,P b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
P operator-(P a,P b){return (P){a.x-b.x,a.y-b.y};}
long long cross(P a,P b){return 1ll*a.x*b.y-1ll*a.y*b.x;}
long long check(P a,P b,P c){return cross(b-a,c-a);} 
int main()
{
    n=read();int i;
    for(i=1;i<=n;i++){p[i].x=read(),p[i].y=-read(),p[i].i=i;}std::sort(p+1,p+n+1,cmp);
    for(i=1;i<=n;i++)
    {
        while(r>1&&check(p[s[r-1]],p[s[r]],p[i])<=0)--r;s[++r]=i;
    }
    for(i=1;i<=r;i++)s[i]=p[s[i]].i;std::sort(s+1,s+r+1);
    for(i=1;i<=r;i++)printf("%d ",s[i]);
    return 0;
}

 

[日常摸鱼]bzoj1007[HNOI2008]水平可见直线-半平面交(对偶转凸包)

标签:bzoj1007   tar   平面   span   long   body   opera   operator   oss   

原文地址:https://www.cnblogs.com/yoooshinow/p/8323567.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!