5問でした。(上二つはコンテスト終了後) image

C - Bowls and Dishes

  • image
  • 一見厄介な問題だけどKが最大16なので2^K回探索しても問題ない python
def main():
    N, M = map(int, input().split())
    AB = []
    for _i in range(M):
        A, B = map(int, input().split())
        AB.append((A - 1, B - 1))
    K = int(input())
    CD = []
    for _i in range(K):
        C, D = map(int, input().split())
        CD.append((C - 1, D - 1))

    ret = 0
    for i in range(2 ** K):
        xs = [0] * N
        for j in range(K):
            cd = CD[j]
            if i & 1:
                xs[cd[0]] = 1
            else:
                xs[cd[1]] = 1
            i >>= 1
        r = 0
        for j in range(M):
            if xs[AB[j][0]] == xs[AB[j][1]] == 1:
                r += 1
        ret = max(ret, r)
    print(ret)

D - Staircase Sequences

  • image
  • 面白い問題
  • 数列の先頭の数をaとすると長さiの列の和は
  • つまりであるような整数i,aの個数を数えれば良い
  • i+1をkと書けば
  • 2Nの約数kについてが偶数か判定すればよい python
def solve(N):
    ret = 0
    for x in get_divisors(2 * N):
        if (2 * N // x - x + 1) % 2 == 0:
            ret += 1
    return ret

E

  • Kが17と小さい
  • ツリーの探索?ツリーとは限らない
  • 深さ優先でたどっても最適ではない
  • グラフをたどる最小値手数?
  • DP?
  • 一旦Fを先に見る

F - Shift and Inversions

  • image
  • フェニック木で差分更新しようとしたが、更新部分をよく考えたらフェニック木の操作が要らなかった
    • 最初に求めるところでだけ使う
  • 先頭のxを取り除くと、xより小さいものの数だけ転倒数が減る
    • 0〜N-1の並び替えなので、それはx
  • 末尾にxを付け加えると、xより大きなものの数だけ転倒数が増える
    • N-1-x python
def main():
    N = int(input())
    AS = list(map(int, input().split()))
    ft = FenwickTree(size=N)

    tento = 0
    for i in range(N):
        tento += ft.sum(N) - ft.sum(AS[i])
        ft.add(AS[i], 1)

    for i in range(N):
        print(tento)
        x = AS[i]
        tento -= x
        tento += (N - 1 - x)

ABC190E