[題解](單調隊列/水)luogu_P3088擠奶牛

d長度內區間最大值,單調隊列維護即可

由於需要滿足左右同時有2倍高度的牛才能更新答案,所以正反跑兩次

#include<bits/stdc++.h>
using namespace std;
const int maxn=50010;
int n,d,ans;
struct node{
    int x,h;
}a[maxn];
int q[maxn],head=1,tail=0;
bool f[maxn];
bool cmp(node a,node b){
    return a.x<b.x;
}
int main()
{
    scanf("%d%d",&n,&d);
    for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].h);
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++){
        while(head<=tail && a[i].x-a[q[head]].x>d)head++;
        while(head<=tail && a[q[tail]].h<=a[i].h)tail--;
        q[++tail]=i;
        if(a[q[head]].h>=a[i].h*2)f[i]=1;
    }
    head=1,tail=0;
    for(int i=n;i>=1;i--){
        while(head<=tail && a[q[head]].x-a[i].x>d)head++;
        while(head<=tail && a[q[tail]].h<=a[i].h)tail--;
        q[++tail]=i;
        if(a[q[head]].h>=a[i].h*2 && f[i])ans++;
    }
    printf("%d",ans);
}
原文地址:https://www.cnblogs.com/superminivan/p/10758225.html