手写单调队列求调 WA 18pts
查看原帖
手写单调队列求调 WA 18pts
700097
Windless_Wilds楼主2022/5/2 18:14
#include<bits/stdc++.h>
#define ll long long
#define MAXN 50001
#define il inline
#define rg register
using namespace std;
struct cow
{
    ll pos,height,i;
}a[MAXN];
queue<cow>s1,s2;
ll crowded[MAXN];
il bool comp(cow a1,cow a2)
{
    return a1.pos<a2.pos;
}
int main()
{
    ll n,d,ans=0;cin>>n>>d;
    for (rg ll i=1;i<=n;++i)
    {
        cin>>a[i].pos>>a[i].height;
        a[i].i=i;
    }
    sort(a+1,a+n+1,comp);
    for (rg ll i=1;i<=n;++i)
    {
        while(s1.size())
        {
            while (s1.size()&&s1.front().pos+d*2<a[i].pos)
			s1.pop();
            while (s1.size()&&s1.back().height*2 <= a[i].height)
            {
                ++crowded[s1.back().i];
                s1.pop();
            }
            if (s1.size()&&!(s1.back().pos+d*2<a[i].pos)) break;
        }
        s1.push(a[i]);
    }
    for (rg ll i=n;i>1;--i)
    {
        while(s2.size())
        {
            while (s2.size()&&s2.front().pos-d*2>a[i].pos)
			s2.pop();
            while (s2.size()&&s2.back().height*2<=a[i].height)
            {
                ++crowded[s2.back().i];
                s2.pop();
            }
            if (s2.size()&&!(s2.back().pos-d*2>a[i].pos)) break;
        }
        s2.push(a[i]);
    }
    for (rg ll i=1;i<=n;++i) if (crowded[i]) ++ans;
    cout<<ans;
    return 0;
}

2022/5/2 18:14
加载中...