这题我们可以用多重集合的贪心,我们不管它是盒子还是巧克力全部一起存入一个结构体当中再排序。我们先按 x x x 由大到小进行排序,如果相等则按 y y y 由大到小进行排序。要是 x x x 和 y y y 都是相等的,我们就先将盒子排在前面。
排完序后,我们从
1
1
1 开始遍历到
n
+
m
n+m
n+m,我们可以利用 multiset
进行查找。如果是巧克力的话,用 lower_bound()
即可,lower_bound()
可以找出第一个也就是大小最相近的
y
y
y 大于等于该巧克力
y
y
y 的盒子。如果没找到则输出 No
,并结束程序。这是因为:没有找到符合要求的盒子来装巧克力,那么接下来的盒子的
x
x
x 都比该巧克力的
x
x
x 小,所以是不符合题意的。
否则将第一个也就是大小最相近的 y y y 大于等于该巧克力 y y y 的盒子踢出集合。如果是盒子的话,就把当前盒子放入集合中。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct op{
int x,y;//分别表示两条边的长度
bool pd;//判断是否为巧克力
}a[1000005];
int n,m;
bool cmp(op a,op b)//比较函数
{
return (a.x==b.x?(a.y==a.y?a.pd<b.pd:a.y>b.y):a.x>b.x);//排序方法,见上
}
multiset<int> q;
signed main()
{
cin>>n>>m;
for(register int i=1;i<=n;i++)
{
cin>>a[i].x;
a[i].pd=true;//标记为巧克力
}
for(register int i=1;i<=n;i++)
{
cin>>a[i].y;
}
for(register int i=n+1,j=1;j<=m;j++,i++)//注意是从n+1开始的,否则会重复
{
cin>>a[i].x;
a[i].pd=false;//标记为盒子
}
for(register int i=n+1,j=1;j<=m;j++,i++)
{
cin>>a[i].y;
}
sort(a+1,a+n+m+1,cmp);
for(register int i=1;i<=n+m;i++)
{
if(a[i].pd==true)//巧克力
{
auto now=q.lower_bound(a[i].y);//查询
if(now==q.end())//没有
{
cout<<"No";
return 0;
}
q.erase(now);//删除
}
else
{
q.insert(a[i].y);//插入
}
}
cout<<"Yes";
return 0;
}