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();
}