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

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #define M 1000000
     5 using namespace std;
     6 struct data
     7 {
     8     int k,b,nu;
     9 }a[M];
    10 int n,q[M],t;
    11 bool cmp(data a1,data a2)
    12 {
    13     if(a1.k==a2.k)
    14       return a1.b<a2.b;
    15     return a1.k<a2.k;
    16 }
    17 bool cmp1(int a1,int a2)
    18 {
    19     return a[a1].nu<a[a2].nu;
    20 }
    21 double crossx(data x1,data x2)
    22 {   
    23     double s1=(x2.b-x1.b),s2=(x1.k-x2.k);
    24     return s1/s2;
    25 }
    26 bool pan(int a1)
    27 {
    28     if(a[a1].k==a[q[t]].k)
    29       return 1;
    30     if(t>1&&crossx(a[a1],a[q[t-1]])<=crossx(a[q[t]],a[q[t-1]]))
    31       return 1;
    32     return 0; 
    33 }
    34 int main()
    35 {
    36     scanf("%d",&n);
    37     for(int i=1;i<=n;i++)
    38       {
    39         scanf("%d%d",&a[i].k,&a[i].b);
    40         a[i].nu=i;
    41       }
    42     sort(a+1,a+n+1,cmp);
    43     q[1]=1;
    44     t=1;
    45     for(int i=2;i<=n;i++)
    46       {
    47         for(;t&&pan(i);t--);
    48         q[++t]=i;
    49       }
    50     sort(q+1,q+t+1,cmp1);
    51     for(int i=1;i<=t;i++)
    52       printf("%d ",a[q[i]].nu);
    53     return 0;
    54 }

    先将线段按斜率从小到大排序,然后挨个进栈,如果这条线段与栈顶元素的交点在栈顶与栈顶下面那个的交点左边,将栈顶出栈。最后将再排序后输出。

  • 相关阅读:
    mybatis plus 执行sql
    springboot 打印 mybatisplus 的sql
    easyexcel 简单使用
    springboot ehcache
    easyexcel 时间转换
    springboot stopwatch
    c# 开机自动启动
    sqlHelper
    DirectX录音
    c# 发邮件
  • 原文地址:https://www.cnblogs.com/xydddd/p/5223764.html
Copyright © 2011-2022 走看看