zoukankan      html  css  js  c++  java
  • bzoj1007: [HNOI2008]水平可见直线

    单调栈维护下凸包。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const double eps=1e-8;
    
    struct segment
    {
        double k,b;int id;
    }seg[510000],sta[510000];int top;
    bool cmp(segment sg1,segment sg2)
    {
        return (sg1.k!=sg2.k)?sg1.k<sg2.k:sg1.b>sg2.b;
    }
    bool cmd(segment sg1,segment sg2)
    {
        return sg1.id<sg2.id;
    }
    
    double jdx(segment sg1,segment sg2)
    {
        return (sg1.b-sg2.b)/(sg2.k-sg1.k);
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%lf%lf",&seg[i].k,&seg[i].b), seg[i].id=i;
        sort(seg+1,seg+n+1,cmp);
        int tp=1;
        for(int i=2;i<=n;i++)
            if((seg[tp].k-seg[i].k)>eps)seg[++tp]=seg[i];
        
        top=2;
        sta[1]=seg[1];sta[2]=seg[2];
        for(int i=3;i<=n;i++)
        {
            while(top>1&&jdx(sta[top-1],sta[top])>=jdx(sta[top-1],seg[i]))top--;
            sta[++top]=seg[i];
        }
        
        sort(sta+1,sta+top+1,cmd);
        for(int i=1;i<=top;i++)printf("%d ",sta[i].id);
        return 0;
    }

     

  • 相关阅读:
    63.C++异常
    62.C++文件操作list实现内存检索,实现两千万数据秒查
    61.C++文件操作实现硬盘检索
    ios之数据持久化
    ios NSRange
    安排
    接口隔离原则
    Liskon替换原则
    开放封闭原则
    单一职责原则
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/8652038.html
Copyright © 2011-2022 走看看