各セットは必ず1個以上のぶりとおでんを含んでいることから,
1個しかセットを買わない,または1個も買わないという選択は最適とはなりえません.
よって,この問題は以下の問題に帰着させることができます.
N項からなる正整数列{ai}i=1N,{bi}i=1Nが与えられます.
- min1≤i≤j≤N{ai+aj,bi+bj}
の最大値を求めてください.
まず買うセットを1つ固定します(便宜上i個目とします).
次に以下の判定問題を解くことを考えます.
- min{ai+aj,bi+bj}≥xとなるjは存在するか?
これはxの大きさ対して単調性があるので,
条件を満たすaj,bjの値を効率よく取得することができれば
二分探索により高速に求めることができます.
最後に上の太字の部分を考えてみましょう.
min{ai+aj,bi+bj}≥x⇒ai+aj≥xかつbi+bj≥xであることから,
条件を満たすjはbj≥max{0,x−bi}を満たすものの中で,
aj≥max{0,x−ai}を満たすものということができます.
これは2項演算をmax{∙,∙}とするセグメント木によって高速に求めることができます.
以上の議論により,iを1つ決めうった時に達成することのできる最大値を高速に求めることができたので,
あとはすべてのiに対して同様の操作をすればよいです.
時間計算量はM:=max{a1,a2,⋯,aN,b1,b2,⋯,bN}
としてO(N(log(M))2)です.
余談:かなり実行時間カツカツで,
Pythonでやると入力で重いかなと思いこのような入力形式をとりました.
やりづらかったらすみません.