Loading

ABC 214E Packing Under Range Regulations(贪心模拟)

Packing Under Range Regulations

给出\(n\,(1 \le n \le 2e5)\)个区间限制\([l, \; r]\),表示在编号为\([l ,\; r]\)的盒子中必须有一个球,请问是否能够合理地放置球满足条件:每个盒子中至多只有一个球。

思路:

​ 我们很容易可以想到用左端点小到大排序,然后右端点小到大,但是发现这样做的是不对的,可以用一组数据轻松将其hack。我们的思路应该是这样的,枚举左端点 l,每次优先处理 r 最小的球,一直向后放置,直到下一个 l 的时候停止。这样就可以解决譬如[2, 3], [2, 4], [3, 3]的问题。

代码

​ 先对左端点排序,然后把同一个左端点的右端点都丢进去小根堆,然后尽可能多的放置右端点更小的球,若没有放置完的,保留在小根堆里等待下一个左端点。因为是在下一个左端点处理上一个左端点,所以我们要在最后加入一个inf来处理最后一个左端点。

void solve()
{
    int n;
    cin >> n;
    vector<PII> vc(n);
    for(int i = 0; i < n; i ++)
        cin >> vc[i].first >> vc[i].second;
    sort(all(vc));
    vc.push_back({inf, inf});

    priority_queue<int, vector<int>, greater<int> > q;
    int ok = 1;
    int pos = -1;
    for(auto [l, r] : vc)
    {
        if(pos == l)
            q.push(r);
        else
        {
            while(pos < l && q.size())
            {
                auto t = q.top();
                q.pop();
                if(pos <= t)
                    pos ++;
                else
                    ok = 0;
            }
            pos = l;
            q.push(r);
        }
    }
    if(ok)
        cout << "Yes\n";
    else
        cout << "No\n";
}   

signed main()
{
    int _ = 1;
    cin >> _;
    while(_--)
        solve();
}
posted @ 2022-11-23 16:49  DM11  阅读(61)  评论(0编辑  收藏  举报