zoukankan      html  css  js  c++  java
  • P3194 [HNOI2008]水平可见直线 计算几何栈维护下凸壳

    题解:

    按斜率和截距排序,斜率第一关键字,

    若新加入的直线能覆盖原来的直线,就把原来的直线从栈中去掉

    平面问题 手玩一下

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=5e5+10;
    struct dot
    {
        int x,y;
        int id;
    }
    a[maxn];
    bool cmp(dot x,dot y)
    {
        if(x.x==y.x)
            return x.y>y.y;
        return x.x>y.x;
    }
    double jiao(int x,int y)
    {
        return 1.0*(a[y].y-a[x].y)/(1.0*(a[x].x-a[y].x));
    }
    bool cmp1(int x,int  y)
    {
        return a[x].id<a[y].id;
    }
    int _stack[maxn];
    int top;
    int main(){
       int n;
       cin>>n;
       for(int i=1;i<=n;i++) {cin>>a[i].x>>a[i].y;a[i].id=i;}
       sort(a+1,a+1+n,cmp);
       for(int i=1;i<=n;i++)
       {   
           if(i!=1&&a[i].x==a[i-1].x) continue;
           while(top>1&&jiao(i,_stack[top])>=jiao(_stack[top],_stack[top-1])) top--;
           _stack[++top]=i;
       }
       sort(_stack+1,_stack+1+top,cmp1);
       for(int i=1;i<=top;i++)
       {
           cout<<a[_stack[i]].id<<' ';
       }
       cout<<endl;
    }
  • 相关阅读:
    负环判断模版
    计蒜客NOIP2017提高组模拟赛(四)day1
    NOIP2014-10-30模拟赛
    树链剖分模版
    2014-10-30NOIP复习题1
    NOIP2014-5-17模拟赛
    NOIP2014-5-10模拟赛
    NOIP2014-3-15模拟赛
    HDU1556Color the ball
    HDU1166敌兵布阵
  • 原文地址:https://www.cnblogs.com/acmLLF/p/13365265.html
Copyright © 2011-2022 走看看