题目传送门:E - Wrapping Chocolate
题目大意: 有n块给出长和宽的巧克力和m个给出长和宽的盒子,要求能把巧克力都装进盒子里。
思路:长和宽二维合起来考虑的话将会非常困难,所以应将盒子和巧克力的数组合起来对一个元素作为主键排序,然后从最大开始,每次遇到盒子的数组就把非主键元素放入集合,遇到巧克力数组就以其非主键元素在集合内查找,找到最小的且不小于当前元素的值并删除,找不到就代表没有符合条件的盒子。
代码:
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
int n,m;
struct node{
int l,r,v;
bool operator<(const node &a)const{
return l<a.l||(l==a.l&&r<a.r)||(l==a.l&&r==a.r&&v>a.v);
}
}a[810010];
multiset<int> box;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i].l;
for(int i=1;i<=n;i++)cin>>a[i].r;
for(int i=1;i<=n;i++)a[i].v=1;
for(int i=n+1;i<=n+m;i++)cin>>a[i].l;
for(int i=n+1;i<=n+m;i++)cin>>a[i].r;
sort(a+1,a+1+n+m);
int s1 = 0,s2 = 0;
for(int i=n+m;i>=1;i--){
if(a[i].v==0){
box.insert(a[i].r);
}
else{
auto it=box.lower_bound(a[i].r);
if(it==box.end()){
cout<<"No"<<endl;
return 0;
}
box.erase(it);
}
}
cout<<"Yes"<<endl;
}