zoukankan      html  css  js  c++  java
  • 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列

     第一次写单调队列太垃圾。。。

    左右各扫一遍即可。
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #define N 50010
     6 using namespace std;
     7 struct data
     8 {
     9     int x,h;    
    10 }a[N],q[N];
    11 int n,m,l,r; 
    12 int ok1[N],ok2[N];
    13 inline int read()
    14 {
    15     int f=1,ans=0;
    16     char c;
    17     while (!isdigit(c=getchar())) if (c=='-') f=-1;
    18     ans=c-'0';
    19     while (isdigit(c=getchar())) ans=ans*10+c-'0';
    20     return ans*f;
    21 }
    22 bool cmp(data a,data b) {return a.x<b.x;}
    23 int main()
    24 {
    25     n=read(); m=read();
    26     for (int i=1;i<=n;i++) a[i].x=read(),a[i].h=read();
    27     sort(a+1,a+n+1,cmp);
    28     l=1; r=0;
    29     for (int i=1;i<=n;i++)
    30     {
    31         while (l<=r && q[r].h<a[i].h) r--;
    32         q[++r]=a[i];
    33         while (l<=r && q[l].x<a[i].x-m) l++;
    34         if (q[l].h>=2*a[i].h) ok1[i]=1; 
    35     }
    36     l=1; r=0;
    37     for (int i=n;i>=1;i--)
    38     {
    39         while (l<=r && q[r].h<a[i].h) r--;
    40         q[++r]=a[i];
    41         while (l<=r && q[l].x>a[i].x+m) l++;
    42         if (q[l].h>=2*a[i].h) ok2[i]=1;
    43     }
    44     int ans=0;
    45     for (int i=1;i<=n;i++)
    46         if (ok1[i]&&ok2[i]) ans++;
    47     printf("%d
    ",ans);
    48     return 0;
    49 }
    View Code

    Description

     Farmer John's N cows (1 <= N <= 50,000) are grazing along a one-dimensional fence. Cow i is standing at location x(i) and has height h(i) (1 <= x(i),h(i) <= 1,000,000,000). A cow feels "crowded" if there is another cow at least twice her height within distance D on her left, and also another cow at least twice her height within distance D on her right (1 <= D <= 1,000,000,000). Since crowded cows produce less milk, Farmer John would like to count the number of such cows. Please help him.

    N头牛在一个坐标轴上,每头牛有个高度。现给出一个距离值D。

    如果某头牛在它的左边,在距离D的范围内,如果找到某个牛的高度至少是它的两倍,且在右边也能找到这样的牛的话。则此牛会感觉到不舒服。

    问有多少头会感到不舒服。

    Input

    * Line 1: Two integers, N and D.

    * Lines 2..1+N: Line i+1 contains the integers x(i) and h(i). The locations of all N cows are distinct.

    Output

    * Line 1: The number of crowded cows.

    Sample Input

    6 4
    10 3
    6 2
    5 3
    9 7
    3 6
    11 2

    INPUT DETAILS: There are 6 cows, with a distance threshold of 4 for feeling crowded. Cow #1 lives at position x=10 and has height h=3, and so on.

    Sample Output

    2
    OUTPUT DETAILS: The cows at positions x=5 and x=6 are both crowded.

    HINT

     

    Source

    —Anime Otaku Save The World.
  • 相关阅读:
    [补]2019HDU杭电多校第一场A
    [补]2019nowcoder牛客第三场F(暂且)
    [补]2019nowcoder牛客第一场E、I
    [学]从零(多项式基础与FFT)开始BM学习笔记
    [补]2019nowcoder牛客第二场E、H(upd0730)
    从一个简单的例子对win 服务程序进行讲解
    HTTP协议学习记录及总结
    Windows身份验证与forms身份验证的结合
    关于Sql server 的 几道面试题
    PlaceHolder控件的使用
  • 原文地址:https://www.cnblogs.com/DMoon/p/5422650.html
Copyright © 2011-2022 走看看