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

Posted yoooshinow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[日常摸鱼]bzoj1007[HNOI2008]水平可见直线-半平面交(对偶转凸包)相关的知识,希望对你有一定的参考价值。

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

具体见这里: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[HNOI2008]水平可见直线

BZOJ 1007: [HNOI2008]水平可见直线

bzoj 1007 [HNOI2008]水平可见直线(单调栈)

BZOJ 1007: [HNOI2008]水平可见直线

bzoj1007: [HNOI2008]水平可见直线

bzoj1007: [HNOI2008]水平可见直线(单调栈)