2020年3月6日金曜日

UTPC 2011 G - プログラミングコンテストチャレンジブック

2つの三角形をA,BA, Bとして、それらの3辺をそれぞれ長いほうからA1,A2,A3A_1, A_2, A_3, B1,B2,B3B_1, B_2, B_3とする。6辺の中で一番長い辺をA1A_1としてよい。

入力(ai)(a_i)があらかじめ長さの降順で並んでいるとする。6辺の選び方の順番を全列挙すると次のようになる:

  • A1,A2,A3,B1,B2,B3A_1, A_2, A_3, B_1, B_2, B_3
  • A1,A2,B1,A3,B2,B3A_1, A_2, B_1, A_3, B_2, B_3
  • A1,A2,B1,B2,A3,B3A_1, A_2, B_1, B_2, A_3, B_3
  • A1,A2,B1,B2,B3,A3A_1, A_2, B_1, B_2, B_3, A_3
  • A1,B1,A2,A3,B2,B3A_1, B_1, A_2, A_3, B_2, B_3
  • A1,B1,A2,B2,A3,B3A_1, B_1, A_2, B_2, A_3, B_3
  • A1,B1,A2,B2,B3,A3A_1, B_1, A_2, B_2, B_3, A_3
  • A1,B1,B2,A2,A3,B3A_1, B_1, B_2, A_2, A_3, B_3
  • A1,B1,B2,A2,B3,A3A_1, B_1, B_2, A_2, B_3, A_3
  • A1,B1,B2,B3,A2,A3A_1, B_1, B_2, B_3, A_2, A_3

これらを調べていく。三角形が成立するためには、A1<A2+A3,B1<B2+B3A_1 < A_2 + A_3, B_1 < B_2 + B_3が成り立っていることが必要十分なので、小さいほうの4辺A2,A3,B2,B3A_2, A_3, B_2, B_3は左に詰めても損にならない。したがって、下の列挙で-でつながった辺同士は列(ai)(a_i)上で隣り合っているとしてよい。

  • A1A2A3,B1B2B3A_1 - A_2- A_3, B_1- B_2 - B_3
  • A1A2,B1A3B2B3A_1 - A_2, B_1 - A_3 - B_2 - B_3
  • A1A2,B1B2A3B3A_1 - A_2, B_1 - B_2 - A_3 - B_3
  • A1A2,B1B2B3A3A_1 - A_2, B_1 - B_2 - B_3 - A_3
  • A1,B1A2A3B2B3A_1, B_1 - A_2 - A_3 - B_2 - B_3
  • A1,B1A2B2A3B3A_1, B_1 - A_2 - B_2 - A_3 - B_3
  • A1,B1A2B2B3A3A_1, B_1 - A_2 - B_2 - B_3 - A_3
  • A1,B1B2A2,A3B3A_1, B_1 - B_2 - A_2, - A_3 - B_3
  • A1,B1B2A2B3A3A_1, B_1 - B_2 - A_2 - B_3 - A_3
  • A1,B1B2B3A2A3A_1, B_1 - B_2 - B_3 - A_2 - A_3

これらを3つに分類してそれぞれ最大値を計算する。

  • A1A2A3,B1B2B3A_1 - A_2- A_3, B_1- B_2 - B_3

これはいちばん簡単で、三角不等式を満たす連続する3辺を左から探して、見つかったらさらに3辺を探せばよい。

  • A1,B1A2A3B2B3A_1, B_1 - A_2 - A_3 - B_2 - B_3
  • A1,B1A2B2A3B3A_1, B_1 - A_2 - B_2 - A_3 - B_3
  • A1,B1A2B2B3A3A_1, B_1 - A_2 - B_2 - B_3 - A_3
  • A1,B1B2A2,A3B3A_1, B_1 - B_2 - A_2, - A_3 - B_3
  • A1,B1B2A2B3A3A_1, B_1 - B_2 - A_2 - B_3 - A_3
  • A1,B1B2B3A2A3A_1, B_1 - B_2 - B_3 - A_2 - A_3

連続する5辺のすべてについて、BBが三角不等式を満たすような選び方でA2+A3A_2 + A_3が最大になるものを検討すればよい。その選び方について、ai<A2+A3a_i < A_2 + A_3となるような最大のaia_iを左方から探せばよくて、これは二分探索でできる。

  • A1A2,B1A3B2B3A_1 - A_2, B_1 - A_3 - B_2 - B_3
  • A1A2,B1B2A3B3A_1 - A_2, B_1 - B_2 - A_3 - B_3
  • A1A2,B1B2B3A3A_1 - A_2, B_1 - B_2 - B_3 - A_3

やはり連続する4辺のすべてについて、BBが三角不等式を満たすような選び方でA3A_3が最大になるものを検討すればよい……のだが、その選び方について、左方にあるai,ai+1a_i, a_{i+1}aiai+1<A3a_i - a_{i+1} < A_3を満たすものの中でai+ai+1a_i + a_{i+1}が最大になるものを探す必要がある。これは(遅延伝搬付きの)平衡二分木に、aiai+1a_i - a_{i+1}をキー、ai+ai+1a_i + a_{i+1}を値として挿入していって、キーがA3A_3より小さい区間の中での最大値を求めればよい。O(NlogN){O}(N \log N)


  • A1A2A3,B1B2B3A_1 - A_2- A_3, B_1- B_2 - B_3

以外のパターンはすべて左に詰めることができるので、連続した6辺だけを調べればよいらしい。まったく気づかなかった。