from 競技プログラミングで解法を思いつくための典型的な考え方 abc152_f https://atcoder.jp/contests/abc152/tasks/abc152_f

  • N=50
  • 木の2点を結ぶパスに1つ以上黒があることが条件
    • 余事象を考える
    • 「パスがすべて白」
    • これは求めやすい、パスの長さをxとしたら2^(N-x)ぐらい
    • 一つの制約に注目して、それが違反してる場合の数は簡単に求まる。制約は複数ある、同時に満たされるケースがダブルカウントされてる→ 包除原理だね
    • 制約は20個ある。2^20はきわどい。DPするのかな?
    • 複数の制約のパスが重なることある?当然ある
      • これは厄介だな?
      • 複数のパスの集合にパスを付け加えた場合の「重なる辺の数」を高速に得ることが必要?
      • 最小共通祖先を前計算する?
  • 公式解説
    • 包除原理までOK
    • 複数のパスの重なり合いに関して「最小共通祖先を求めて木上で累積和」らしい、よくわからん
      • 2^20の全パターンでO(N+M)で数えるらしい
  • 別解
    • 辺が高々50なのでint64に収まる
    • パスをビットで表現しておけばORで重ね合わせを計算できる