• bzoj1007 [HNOI2008]水平可见直线


    1007: [HNOI2008]水平可见直线

    Time Limit: 1 Sec  Memory Limit: 162 MB
    Submit: 3099  Solved: 1128
    [Submit][Status]

    Description

    Input

    第一行为N(0 < N < 50000),接下来的N行输入Ai,Bi

    Output

    从小到大输出可见直线的编号,两两中间用空格隔开,最后一个数字后面也必须有个空格

    Sample Input

    3
    -1 0
    1 0
    0 0

    Sample Output

    1 2

    首先以k为关键字排序。接着将n条边顺序加入一个栈中。考虑这样的情况:假设栈中有cnt个点,可以求出当前第i条边与栈中第cnt-1条边、栈中第cnt条边与第cnt-1条边的交点的横坐标。由于快排后满足k[cnt-1]<=k[cnt]<=k[i],因此若第i条边与栈中第cnt-1条边交点在栈中第cnt条边与第cnt-1条边的交点左边,则栈中第cnt条边会被第i条边与栈中第cnt-1条边挡住。此时栈顶弹出,再找下一个cnt是否满足上述关系。只要维护一个单调栈即可。

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #define eps 1e-8
    using namespace std;
    int n,top,mark1,mark2;
    struct line{
        double k,b;
        int rank;
    }dat[100000];
    line stack[100000];
    int ans[100000];
    bool cmp(line a,line b)
    {
        return a.k<b.k||a.k==b.k&&a.b<b.b;
    }
    double xji(line x1,line x2)
    {
        return (x2.b-x1.b)/(x1.k-x2.k);
    }
    void work(line a)
    {
        if (top==0){stack[++top]=a;return;}
        while(top)
        {
            if(fabs(stack[top].k-a.k)<eps)top--;
            else if(top>1&&xji(a,stack[top-1])<=xji(stack[top],stack[top-1]))
                top--;
            else break;
        }
        stack[++top]=a;
    }
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
        {
          cin>>dat[i].k>>dat[i].b;
          dat[i].rank=i;
        }
        sort(dat+1,dat+n+1,cmp);
        for (int i=1;i<=n;i++)work(dat[i]);
        for (int i=1;i<=top;i++)
          ans[i]=stack[i].rank;
        sort(ans+1,ans+top+1);
        for (int i=1;i<=top;i++)
          cout<<ans[i]<<' ';
    }
    
    


    ——by zhber,转载请注明来源
  • 相关阅读:
    mexopencv
    Computer Vision Resources
    Immersive Imaging
    汇编指令
    I/O输入系统
    大容量存储器的结构
    文件系统实现
    文件系统接口
    虚拟内存
    内存管理
  • 原文地址:https://www.cnblogs.com/zhber/p/4036127.html
Copyright © 2020-2023  润新知