Make Many Buri-Oden

2 secs 1024 MB
RedSpica's icon RedSpica

各セットは必ず11個以上のぶりとおでんを含んでいることから, 11個しかセットを買わない,または11個も買わないという選択は最適とはなりえません.

よって,この問題は以下の問題に帰着させることができます.

NN項からなる正整数列{ai}i=1N,{bi}i=1N\{a_i\}_{i=1}^{N},\{b_i\}_{i=1}^{N}が与えられます.

  • min1ijN{ai+aj,bi+bj}\min_{1 \leq i \leq j \leq N} \{a_i+a_j,b_i+b_j \}

の最大値を求めてください.

まず買うセットを11つ固定します(便宜上ii個目とします). 次に以下の判定問題を解くことを考えます.

  • min{ai+aj,bi+bj}x\min \{ a_i+a_j , b_i+b_j\} \geq xとなるjjは存在するか?

これはxxの大きさ対して単調性があるので, 条件を満たすaj,bja_j,b_jの値を効率よく取得することができれば 二分探索により高速に求めることができます.

最後に上の太字の部分を考えてみましょう.
min{ai+aj,bi+bj}xai+ajx\min \{ a_i+a_j , b_i+b_j\} \geq x \Rightarrow a_i+a_j \geq xかつbi+bjxb_i+b_j \geq xであることから, 条件を満たすjjbjmax{0,xbi}b_j \geq \max \{ 0, x-b_i\}を満たすものの中で, ajmax{0,xai}a_j \geq \max \{0, x-a_i\}を満たすものということができます. これは2項演算をmax{,}\max\{ \bullet , \bullet \}とするセグメント木によって高速に求めることができます.

以上の議論により,ii11つ決めうった時に達成することのできる最大値を高速に求めることができたので, あとはすべてのiiに対して同様の操作をすればよいです.

時間計算量はM:=max{a1,a2,,aN,b1,b2,,bN}M:= \max \{a_1,a_2,\cdots , a_N, b_1 ,b_2, \cdots ,b_N\} としてO(N(log(M))2)O(N(\log(M))^2)です.

余談:かなり実行時間カツカツで, Pythonでやると入力で重いかなと思いこのような入力形式をとりました. やりづらかったらすみません.