社区讨论

手写单调队列求调 WA 18pts

P3088[USACO13NOV] Crowded Cows S参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo8xym8s
此快照首次捕获于
2023/10/28 02:23
2 年前
此快照最后确认于
2023/10/28 02:23
2 年前
查看原帖
CPP
#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;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...