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

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1007

    解:直线的上表面一定是一个下凹的形状,那么按斜率排序后维护凸包即可。注意将斜率相同的直线特判一下,取B值大的

     1 /*
     2  * Problem:  
     3  * Author:  SHJWUDP
     4  * Created Time:  2015/6/9 星期二 13:36:54
     5  * File Name: 233.cpp
     6  * State: 
     7  * Memo: 
     8  */
     9 #include <iostream>
    10 #include <cstdio>
    11 #include <cstring>
    12 #include <algorithm>
    13 #include <cmath>
    14 #include <vector>
    15 
    16 using namespace std;
    17 
    18 const double INF=0x7f7f7f7f;
    19 const double eps=1e-7;
    20 
    21 const int MaxA=5e4+7;
    22 
    23 struct Data {
    24     double A, B;
    25     int id;
    26     bool operator<(const Data& rhs) const {
    27         if(fabs(A-rhs.A)<eps) return B>rhs.B;
    28         return A<rhs.A;
    29     }
    30 } dt[MaxA];
    31 
    32 int N;
    33 pair<int, double> stk[MaxA];
    34 int top;
    35 int main() {
    36 #ifndef ONLINE_JUDGE
    37     freopen("in", "r", stdin);
    38     //freopen("out", "w", stdout);
    39 #endif
    40     while(~scanf("%d", &N)) {
    41         for(int i=0; i<N; i++) {
    42             scanf("%lf%lf", &dt[i].A, &dt[i].B);
    43             dt[i].id=i+1;
    44         }
    45         sort(dt, dt+N);
    46 
    47         top=0;
    48         stk[++top]=make_pair(0, -INF);
    49         for(int i=1; i<N; i++) {
    50             Data& u=dt[i];
    51             if(u.A-dt[stk[top].first].A<eps) continue;
    52             double tmp;
    53             while(top) {
    54                 pair<int, double>& x=stk[top];
    55                 Data& d=dt[x.first];
    56                 tmp=(u.B-d.B)/(d.A-u.A);
    57                 if(tmp-x.second<eps) top--;
    58                 else break;
    59             }
    60             stk[++top]=make_pair(i, tmp);
    61         }
    62         vector<int> vec(top);
    63         for(int i=1; i<=top; i++) {
    64             vec[i-1]=dt[stk[i].first].id;
    65         }
    66         sort(vec.begin(), vec.end());
    67         for(int i=0; i<top; i++) {
    68             printf("%d ", vec[i]);
    69         }
    70         puts("");
    71     }
    72     return 0;
    73 }
    View Code
  • 相关阅读:
    spring mvc 详细配置
    eclipse PermGen space解决方案
    JDK环境变量详细讲解
    Linux 中如何卸载已安装的软件
    Struts2工作原理
    HashMap的工作原理深入再深入
    Session的工作原理
    什么办法可以替代distinct
    脚踏实地才能仰望星空
    Ubuntu 进阶命令——长期不定时更新
  • 原文地址:https://www.cnblogs.com/shjwudp/p/4563521.html
Copyright © 2011-2022 走看看