zoukankan      html  css  js  c++  java
  • BZOJ

    007: [HNOI2008]水平可见直线

    Time Limit: 1 Sec  Memory Limit: 162 MB
    Submit: 6614  Solved: 2519
    [Submit][Status][Discuss]

    Description

      在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为
    可见的,否则Li为被覆盖的.
    例如,对于直线:
    L1:y=x; L2:y=-x; L3:y=0
    则L1和L2是可见的,L3是被覆盖的.
    给出n条直线,表示成y=Ax+B的形式(|A|,|B|<=500000),且n条直线两两不重合.求出所有可见的直线.

    Input

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

    Output

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

    Sample Input

    3
    -1 0
    1 0
    0 0

    Sample Output

    1 2

    题解:需要维护一个上凹的这么一个图形,从上往下直观的看到几个拐点,就应该是n-1条直线。

         1.按斜率第一关键字,截距第二关键字排序。2.需要一个单调栈来维护,每当该斜率的直线需要入队列时。

            需要判断 x1 : (i, top), x2 :   (top, top-1)这两个交点的情况。当 x1  <= x2 的时候要不断pop;

    代码:

     1 #include <algorithm>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <bitset>
     5 #include <vector>
     6 #include <queue>
     7 #include <stack>
     8 #include <cmath>
     9 #include <list>
    10 #include <set>
    11 #include <map>
    12 #define rep(i,a,b) for(int i = a;i <= b;++ i)
    13 #define per(i,a,b) for(int i = a;i >= b;-- i)
    14 #define mem(a,b) memset((a),(b),sizeof((a)))
    15 #define FIN freopen("in.txt","r",stdin)
    16 #define FOUT freopen("out.txt","w",stdout)
    17 #define IO ios_base::sync_with_stdio(0),cin.tie(0)
    18 #define mid ((l+r)>>1)
    19 #define ls (id<<1)
    20 #define rs ((id<<1)|1)
    21 #define N 50005
    22 #define INF 0x3f3f3f3f
    23 #define INFF ((1LL<<62)-1)
    24 #define mod 998244353
    25 typedef long long ll;
    26 using namespace std;
    27   
    28 int n,q[N],ans[N]; // q[n] = [l, r);
    29 struct Node{
    30     int a,b,id;
    31     bool operator < (const Node &r) const {
    32         if(a == r.a)    return b > r.b;
    33         return a < r.a;
    34     }
    35 }node[N];
    36 double cal(int x, int y){
    37     double ans = (node[y].b-node[x].b)*1.0/(node[x].a-node[y].a);
    38     return ans;
    39 }
    40 int main()
    41 {IO;
    42     //FIN;
    43     while(cin >> n){
    44         rep(i, 1, n)    { cin >> node[i].a >> node[i].b; node[i].id = i; }
    45         sort(node+1, node+n+1);
    46         int top = 0;
    47         rep(i, 1, n){
    48             if(top >= 2){
    49                 while(top >= 2){
    50                     double x = cal(i, q[top-1]), X = cal(q[top-1], q[top-2]);
    51                     if(x <= X)   top--;
    52                     else
    53                         break;
    54                 }
    55             }
    56             q[top++] = i;
    57         }
    58         int len = 0;
    59         rep(i, 0, top-1)    ans[len++] = node[q[i]].id;
    60         sort(ans, ans+len);
    61         rep(i, 0, len-1)    cout << ans[i] << " ";
    62     }
    63     return 0;
    64 }
    View Code
  • 相关阅读:
    git pull遇到错误:error: Your local changes to the following files would be overwritten by merge:
    angular 过滤器(日期转换,时间转换,数据转换等)
    js 毫秒转天时分秒
    使用Vue-Router 2实现路由功能
    vue-cli中安装方法
    Vue 2.5 发布了:15篇前端热文回看
    es6 语法 (模块化)
    es6 语法 (Decorator)
    es6 语法 (Generator)
    js 判断当前是什么浏览器
  • 原文地址:https://www.cnblogs.com/Jstyle-continue/p/6351916.html
Copyright © 2011-2022 走看看