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); }