5問解いたけど、まだ茶色です atcoder image image A 大文字か小文字か判断する問題、開始63秒 python

from string import ascii_lowercase
s = input()
if s[0] in ascii_lowercase:
    print("a")
else:
    print("A")

B、N個の数値のうち、小さい方のK個を足し合わせる問題、100秒 python

N, K = map(int, input().split())
PS = list(map(int, input().split()))
PS.sort()
print(sum(PS[:K]))

C 数値をExcel的な変則26進法で表現する問題。 この問題、観測範囲の人が軒並みD問題より時間を喰われている。罠。 いかにもハマりやすそうなので、doctestでテストケース書きながら3桁まで書き下ろして、それからwhileでまとめました。13分。 python

def solve(N):
    q = N
    ret = ""
    while True:
        q, r = divmod(q - 1, 26)
        ret = ascii_lowercase[r] + ret
        if q == 0:
            print(ret)
            return

コード全体はこちら https://atcoder.jp/contests/abc171/submissions/14549017 開発過程を詳しく書いた テストドリブンで変形26進法の実装

D、10万個の数値があって、10万回「ある数値を別の数値に置換」をして、そのたびに総和を出力する問題 最初にぜんぶの数の個数をカウントして、総和を求めて、後は更新していくだけ。5分。 python

count = [0] * (10 ** 5 + 10)

def main():
    N = int(input())
    AS = map(int, input().split())
    sum = 0
    for a in AS:
        count[a] += 1
        sum += a
    Q = int(input())
    for q in range(Q):
        B, C = map(int, input().split())
        sum += (C - B) * count[B]
        count[C] += count[B]
        count[B] = 0
        print(sum)

E、最大20万個の数の「自分以外のxor」が渡されて、元の数を当てる問題。 初手「あれ?これ入力をそのまま返せばいいのでは?」と思ってダメ元でサブミットしたらやっぱりダメでした。結局N=2, 3, その他、で場合分けしたけど必要はなかったっぽい。 解が一意でない可能性があるので、正しい解であるかどうかのテストコードを書いて、N=4のテストケースを2進表記してじっくり眺めて、辻褄のあう式を捻り出し、正しい解になってることを確認してサブミット。 グダグダしてるのをそのまま載せると下記。前半のループで正しい答えのつもりだったのだけど間違ってて、正しい答えと見比べて、間違ってるところだけビットを反転してる。無理やりです。42分。二進表記 python

"""
input
0b00000000000000000000000010100
0b00000000000000000000000001011
0b00000000000000000000000001001
0b00000000000000000000000011000

output
0b00000000000000000000000011010
0b00000000000000000000000000101
0b00000000000000000000000000111
0b00000000000000000000000010110

myanswer
0b00000000000000000000000000000
0b00000000000000000000000011111
0b00000000000000000000000011101
0b00000000000000000000000001100
"""
# for a in AS:
#     print(f"{a:#031b}")
r = [0] * N
for i in range(1, N):
    r[i] = r[i - 1] ^ AS[i - 1] ^ AS[i]

# for a in r:
#     print(f"{a:#031b}")

rest = reduce(xor, r[1:])
d = AS[0] ^ rest
for i in range(N):
    r[i] ^= d

print(*r)
# check
# total = reduce(xor, r)
# for i in range(N):
#     print(total ^ r[i] == AS[i])

reduceがfunctoolsに移動してるの知らなかった。

もっと簡潔に書いてる人のコードを見てみよう。ACで一番短い人のコードを… python

_,a=open(x:=0)
*a,=map(int,a.split())
for i in a:x^=i
for i in a:print(x^i)

https://atcoder.jp/contests/abc171/submissions/14588050 こ、これは…ゴルフだ… まず3.8から導入されたセイウチ演算子でxに0を入れつつopen(0)している。これはファイルデスクリプタ指定でのopenで、0は標準入力だ。 開かれたファイルはPythonでは行単位のイテレータになるので、アンパック代入で入力の2行目がaに入る。 mapの結果はイテレータなので、スターで受けることで評価を強制してリストに変えている。これをしないと3行目のforでイテレータを食いつぶして4行目のforが回らない。 3行目で全体のxorを取って、4行目でそれとAiとのxorを出力している。これ改行区切りなので問題の「空白区切りで出力せよ」の条件をパスするのは意外。

これを踏まえて僕的に書くとこんな感じ python

from functools import reduce
from operator import xor

_N = int(input())
AS = list(map(int, input().split()))
total = reduce(xor, AS)
print(*[a ^ total for a in AS])

データ構造を勉強したのに全然出てない! Fは解き直して、解けてから解説を書く。 ABC171_F