[BZOJ1007]HNOI2008水平可见直线|计算几何|栈
2015-04-17 09:24
656 查看
第一道计算几何题。。首先显然斜率最大(小)的一定会看见(假设斜率各不相同),先按k第一关键字,b第二关键字排序,然后维护一个栈,先把前两条直线丢进去,之后再加直线进去的时候要判断一下这条直线和栈顶直线交点和栈顶两条直线交点的关系,这个画一下图更清晰一点,然后一条一条扔进去最后留在里面的就是可以看到的了。。
#include<iostream> #include<cstdio> #include<memory.h> #include<algorithm> using namespace std; struct line{ int a,b,xu; }l[50005],stack[50005],b,c; int i,n,top; double x1,x2; bool cmp1(line a,line b) { if (a.a!=b.a) return a.a>b.a; else return a.b>b.b; } bool cmp2(line a,line b) { return a.xu<b.xu; } void try1(line a) { while (top>1) { b=stack[top]; if (a.a==b.a) return; c=stack[top-1]; x1=(double)(c.b-b.b)/(double)(b.a-c.a);x2=(double)(b.b-a.b)/(double)(a.a-b.a); if (x2<x1) break; else top--; } if (stack[top].a!=a.a) stack[++top]=a; } int main() { freopen("1007.in","r",stdin); scanf("%d",&n); for (i=1;i<=n;i++) { scanf("%d%d",&l[i].a,&l[i].b); l[i].xu=i; } sort(l+1,l+1+n,cmp1); top=0;stack[0].a=500001; for (i=1;i<=n;i++) try1(l[i]); sort(stack+1,stack+1+top,cmp2); for (i=1;i<=top;i++) printf("%d ",stack[i].xu); }
相关文章推荐
- BZOJ1007 [HNOI2008]水平可见直线 计算几何 单调栈维护上凸包
- bzoj 1007: [HNOI2008]水平可见直线(计算几何)
- 【BZOJ1007】【HNOI2008】水平可见直线(计算几何 凸壳)
- BZOJ 1007: [HNOI2008]水平可见直线( 计算几何 )
- 【BZOJ 1007】【HNOI 2008】水平可见直线 【计算几何】
- bzoj 1007 : [HNOI2008]水平可见直线 计算几何
- HYSBZ/BZOJ 1007 [HNOI2008] 水平可见直线 - 计算几何
- 【几何】[HNOI2008][BZOJ1007]水平可见直线
- 【XSY2138】【BZOJ1007】【HNOI2008】水平可见直线 几何 单调栈
- BZOJ 1007: [HNOI2008]水平可见直线 几何
- 【BZOJ 1007】【HNOI 2008】水平可见直线 解析几何
- bzoj 1007: [HNOI2008]水平可见直线
- BZOJ 1007 [HNOI2008]水平可见直线 ——计算几何
- BZOJ 1007: [HNOI2008]水平可见直线 栈/计算几何
- [bzoj1007][HNOI2008][水平可见直线] (斜率不等式)
- BZOJ 1007 HNOI 2008 水平可见直线 计算几何+栈
- BZOJ1007【HNOI2008】水平可见直线
- bzoj 1007 [HNOI2008]水平可见直线
- bzoj1007: [HNOI2008]水平可见直线
- [单调栈] bzoj1007: [HNOI2008]水平可见直线