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

    xiaoxiao2021-04-15  28

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

    #include<bits/stdc++.h> 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.x<b.x;} 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].y<a[i].y)r--; qq[++r]=a[i]; while(l<=r&&qq[l].x<a[i].x-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].y<a[i].y)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; }
    转载请注明原文地址: https://ju.6miu.com/read-671799.html

    最新回复(0)