メルカリ競プロコンテスト2024

2024/10/05

競プロ

1. A問題

コンテストページへのリンク

A問題

問題

メル君は使わなくなったスマホをメルカリで出品しようとしています。 メル君は、販売中のどのスマホよりも安く、売り切れのどのスマホよりも高い値段で出品しようと考えています。

メルカリにはスマホが NN 個出品されており、それぞれ 11 から NN までの番号が割り当てられています。 ii 番目のスマホの値段 CiC_i​ と、販売状況を表す文字列 SiS_i​ が与えられます。SiS_i​ が sold_out ならそのスマホが売り切れであることを表し、on_sale ならそのスマホが販売中であることを表します。

メルくんが決めた値段 PP が、以下の条件を満たすかを判定してください。

条件:全ての整数 i(1iN)i(1\leq i\leq N) について

  • SiS_i​ が on_sale なら P<CiP<C_i
  • SiS_i​ が sold_out なら Ci<PC_i<P

解答

on_saleの最小値とsold_outの最大値を求めて条件を確認するとよいです。C++だと std::min_elementstd::max_element を使うと楽です。

B問題

問題

メルカリには、ユーザー 11 からユーザー 10910^9 までの 10910^9 人のユーザーがいます。また、メルカリには、商品 11 から商品 10910^9 までの 10910^9 個の商品が 11 つずつ出品されています。

はじめ、すべてのユーザーの幸福度は 00 です。

次のような形式の情報が NN 個与えられます。ii 番目の情報は以下の通りです。

  • ユーザー uiu_i が商品 viv_i を購入すると、そのユーザーの幸福度が hih_i 上昇する。

ユーザーが NN 個の情報にない方法で商品を購入することはできません。すべてのユーザーの幸福度の合計が最大となるような購入方法を求めてください。 購入方法とは、商品 vjv_j がユーザー uju_j によって購入されることを表す情報 (vj,uj)(v_j,u_j) の集合です。ただし、 11 つの商品は一度のみ購入することができます。

なお、与えられる入力では、幸福度の合計が最大となる購入方法が一意に定まることが保証されています。

解答

ユーザーは何個でも商品を買えるので、各商品に対して買われたときに幸福度が最も上昇するユーザーを求めればよいです。mapで各商品の幸福度を管理すると楽です。

C問題

問題

高さ HH cm、幅 WW cmのディスプレイがあります。このディスプレイ内を点が動くスクリーンセーバーを開発しました。ディスプレイの左下の座標を (0,0)(0,0) とし、ディスプレイの左下から右に xx cm、上に yy cm移動した点の座標を (x,y)(x,y) と表します。

時刻 00 秒に点は (sx,sy)(s_x​,s_y​) にあります。はじめ、点は (sx,sy)(s_x​,s_y​) から (sx+1,sy+1)(s_x​+1,s_y​+1) 方向に秒速 2\sqrt2​ cmで真っすぐ進み出します。そして、この点は普通の光と同じように真っすぐ進み、画面端に到達すると同じ速度で反射します。

初期座標 (sx,sy)(s_x​,s_y​) が与えられるので時刻 TT 秒での点の座標を求めてください。

解答

xx 成分と yy 成分は独立に考えられます。 xx 成分で考えると、往復しているようになっているので sx+Ts_x+T2W2W で割ったあまりを求めるとよいです。( WW より大きい場合は、 2W2W から引きましょう)

D問題

問題

メルカリには NN 個のレアシューズが存在し、ii 番目 (1iN)(1\leq i\leq N) のレアシューズは、時刻 xix_i​ に出品され、時刻 yiy_i​ に出品が終了します。 また、MM 人のユーザーがレアシューズを購入しようとしています。jj 番目 (1jM)(1\leq j\leq M) のユーザーは、時刻 zjz_j​ にレアシューズを購入することを希望しており、 xizjyix_i​\leq z_j\leq y_i​ を満たすとき、ii 番目のレアシューズを購入することができます。ただし、各ユーザーは 11 つしかレアシューズを購入せず、購入されたレアシューズは他のユーザーが購入することはできなくなります。

各レアシューズをどのユーザーが購入するかを自由に選択できるとき、 最大で何人のユーザーがレアシューズを購入できるかを求めてください。

解答

(xi,yi)(x_i,y_i)xix_iが小さい順にソートしておきます。 ziz_iが小さいものから、 xjzjx_j \leq z_j を満たす全ての (xj,yj)(x_j,y_j) に対して、 multisetpriority_queueyiy_i を突っ込んでシミュレーションします。この際、zjyjz_j \leq y_jを満たす yjy_j が存在しない場合は購入せず、存在する場合は条件を満たす最小の yjy_j を選ぶことで、最適解を達成できます。

E問題以降

まだ見てません