[{"data":1,"prerenderedAt":12},["ShallowReactive",2],{"article-5":3},{"id":4,"title":5,"summary":6,"tags":7,"publishedAt":10,"content":11},5,"ABC455参加録","ABC455の参加記録",["Reactive",8],[9],"競技プログラミング","2026-04-26","# ABC455 (Ｓｋｙ株式会社プログラミングコンテスト2026)参加録\r\n\r\n最近時間があるときはまたABCにひっそり参加するようになりました。  \r\nA-Dまではすんなり15分くらいで通したものの、Eの包除原理をちゃんと考えられずそのまま終了。  \r\nAtCoder ProblemsのD埋めではなくE埋めに移行した方がいいかもなーと思ってきたこの頃。  \r\n\r\n## A: [455](https://atcoder.jp/contests/abc455/tasks/abc455_a)\r\n素直にA != B && B == Cを判定した。  \r\n```python\r\ndef solve():\r\n    input = sys.stdin.readline \r\n    A, B, C = map(int, input().split())\r\n    if A != B and B == C:\r\n        print(\"Yes\")\r\n    else:\r\n        print(\"No\")\r\n\r\n\r\n    return 0\r\n```\r\n\r\n## B: [Spiral Galaxy](https://atcoder.jp/contests/abc455/tasks/abc455_b)\r\nH, Wが小さいので力技で全h, wの組全マスの判定をかけた。  \r\n```python\r\ndef solve():\r\n    input = sys.stdin.readline \r\n    H, W = map(int, input().split())\r\n    S = [input().strip(\"\\n\") for _ in range(H)]\r\n    ans = 0\r\n    for h1 in range(H):\r\n        for h2 in range(h1, H):\r\n            for w1 in range(W):\r\n                for w2 in range(w1, W):\r\n                    canCount = True\r\n                    for i in range(h1, h2+1):\r\n                        for j in range(w1, w2+1):\r\n                            if S[i][j] != S[h1+h2-i][w1+w2-j]:\r\n                                canCount = False\r\n                    ans += 1 if canCount else 0\r\n    print(ans)\r\n\r\n    return 0\r\n```\r\n\r\n## C: [Vanish](https://atcoder.jp/contests/abc455/tasks/abc455_c)\r\nそれぞれの数字を辞書で管理し、合計を保持しておく。  \r\n合計値の上位K個を0にして総和をとる。\r\n```python\r\ndef solve():\r\n    input = sys.stdin.readline \r\n    N, K = map(int, input().split())\r\n    A = list(map(int, input().split()))\r\n    AD = dict()\r\n    for a in A:\r\n        if a not in AD:\r\n            AD[a] = 0\r\n        AD[a] += a\r\n    sums = []\r\n    for key, value in AD.items():\r\n        sums.append(value)\r\n    sums.sort(reverse=True)\r\n    for i in range(min(K, len(sums))):\r\n        sums[i] = 0\r\n    print(sum(sums))\r\n\r\n    return 0\r\n```\r\n\r\n## D: [Card Pile Query](https://atcoder.jp/contests/abc455/tasks/abc455_d)\r\nカードCiをPiの上に移動する際に、Ciの上に何が乗っているかは関係がない。  \r\n各操作でCiの下に何が来るか(Piの上に何が来るか)を保持しておき、全操作が終わった終わった後に、動かされていないカードから順に上にあるカードをたどっていけば枚数が分かる。\r\n```python\r\ndef solve():\r\n    input = sys.stdin.readline \r\n    N, Q = map(int, input().split())\r\n    B = [-1] * N\r\n    for i in range(Q):\r\n        c, p = map(int, input().split())\r\n        B[c-1] = p-1\r\n    T =[-1] * N\r\n    Start = []\r\n    for i, b in enumerate(B):\r\n        if b == -1:\r\n            Start.append(i)\r\n        else:\r\n            T[b] = i\r\n    Count = [0] * N\r\n    for s in Start:\r\n        idx = s\r\n        ci = s\r\n        Count[idx] += 1\r\n        while T[ci] > -1:\r\n            ci = T[ci]\r\n            Count[idx] += 1\r\n    print(*Count)\r\n\r\n    return 0\r\n```\r\n\r\n## E: [Unbalanced ABC Substrings](https://atcoder.jp/contests/abc455/tasks/abc455_e)\r\nAとBの差、AとCの差、BとCの差をキーとして、今見ているindexより左にそれぞれ何回発生したかを保持しておく。　　\r\nA == B, B == C, C == Aの数をカウントしておいて、全組み合わせ数から引けば求まる...という方針までは良かったけど、包除を考えて重複を取り除くところをちゃんと考えられず通せず...  \r\n```python\r\ndef solve():\r\n    input = sys.stdin.readline \r\n    N = int(input())\r\n    S = input().strip(\"\\n\")\r\n    AB = [0] * (N+1)\r\n    AC = [0] * (N + 1)\r\n    BC = [0] * (N + 1)\r\n    bd = {0 : 1}\r\n    cd = {0 : 1}\r\n    bcd = {0 : 1}\r\n    dup = {(0, 0): 1}\r\n\r\n    double = 0\r\n    for i in range(N):\r\n        s = S[i]\r\n        if s == \"A\":\r\n            AB[i+1] = AB[i] + 1\r\n            AC[i+1] = AC[i] + 1\r\n            BC[i+1] = BC[i]\r\n        elif s == \"B\":\r\n            AB[i+1] = AB[i] - 1\r\n            AC[i+1] = AC[i]\r\n            BC[i+1] = BC[i] + 1\r\n        else:\r\n            AB[i+1] = AB[i]\r\n            AC[i+1] = AC[i] - 1\r\n            BC[i+1] = BC[i] - 1\r\n        \r\n        b = AB[i+1]\r\n        c = AC[i+1]\r\n        bc = BC[i+1]\r\n        if b not in bd: bd[b] = 0\r\n        if c not in cd: cd[c] = 0\r\n        if bc not in bcd: bcd[bc] = 0\r\n        if (b, c) not in dup: dup[(b, c)] = 0\r\n        double += bd[b] + cd[c] + bcd[bc] - 2 * dup[(b, c)]\r\n\r\n        bd[b] += 1\r\n        cd[c] += 1\r\n        bcd[bc] += 1\r\n        dup[(b, c)] += 1\r\n\r\n    total = N * (N + 1) // 2\r\n    print(total - double)\r\n\r\n    return 0\r\n```",1777162263692]