单调队列——Luogu3088 [USACO13NOV]Crowded Cows

https://www.luogu.org/problem/show?pid=3088
单调队列的裸题吧(虽然我好像也是第一次自己写出单调队列
按照位置排序以后直接上两遍单调队列处理出前面和后面分别是否能够达到条件
其他我就不说了吧

#include
using namespace std;
struct ppap{
    int x,y;
}a[100001];
ppap qq[100001];
bool q[100001],h[100001];
inline bool cmp(ppap a,ppap b){return a.xx;}
int main()
{
    int n,d;scanf("%d%d",&n,&d);
    for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);
    sort(a+1,a+n+1,cmp);
    int l=1,r=0;
    for(int i=1;i<=n;i++){
        while(l<=r&&qq[r].yy)r--;
        qq[++r]=a[i];
        while(l<=r&&qq[l].xx-d)l++;
        if(qq[l].y>=a[i].y*2)q[i]=1;
    }
    memset(qq,0,sizeof qq);l=1;r=0;
    for(int i=n;i;i--){
        while(l<=r&&qq[r].yy)r--;
        qq[++r]=a[i];
        while(l<=r&&qq[l].x>a[i].x+d)l++;
        if(qq[l].y>=a[i].y*2)h[i]=1;
    }
    int ans=0;
    for(int i=1;i<=n;i++)if(q[i]&&h[i])ans++;
    printf("%d",ans);
    return 0;
}

你可能感兴趣的:(栈/队列)