マッチング問題.
箱を大きい順に優先して使っていく. 入るチョコの内,なるべく大きい物を割り当てたい.
箱とチョコを両方まとめて入れ物 \(s\) に入れておく. 辞書順で大きい順に並べておく. \(s\) から順に取り出していく. チョコが出てくるまでに出てきた箱が,使える候補になる. もし使った場合は,\(s\) から削除する. もし使える箱が無かった場合は,箱詰めの割り当ては不可能.
取り出し方から,チョコを取り出した時点で,チョコの \(x\) 方向の大きさは箱の \(x\) 方向の大きさ以下. 問題は,チョコの \(y\) 方向の大きさが,箱の \(y\) 方向の大きさ以下かどうか. それを判定するために,\(s\) から取り出した箱たちの \(y\) 方向の大きさを multiset \(v\) に入れておく.
使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"
int main() {
// 2023-07-08 20:13:50
// 2023-07-08 20:19:13
ll n, m;
cin >> n >> m;
vll a(n); cinv(a);
vll b(n); cinv(b);
vll c(m); cinv(c);
vll d(m); cinv(d);
rep(i,n){
st.push_back({a[i], b[i], 0});
}
rep(i,m){
st.push_back({c[i], d[i], 1});
}
sort(all(st), greater<tuple<ll,ll,ll>>());
multiset<ll> v;
for(auto [x,y,i]: st){
if(i == 1){
v.insert(y);
}else{
auto it = v.lower_bound(y);
if(it == v.end()){
cout << "No" << endl;
return 0;
}
v.erase(it);
}
}
cout << "Yes" << endl;
#ifdef _INPUT_
#endif
#ifdef _DEBUG_
#endif
return 0;
}