競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 245E

ABC245E

マッチング問題.
箱を大きい順に優先して使っていく. 入るチョコの内,なるべく大きい物を割り当てたい.

箱とチョコを両方まとめて入れ物 \(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);  

  vector<tuple<ll,ll,ll>> st;
  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;
}