hirohirohirohirosのブログ

地方国立大学に通う情報系学部4年

Atcoder ABC212, 210 振り返り

A - Alloy【AC】

 A+B>0という制約があるため,この条件式でもAC出来ます.

A, B = map(int, input().split())
if B == 0:
    print("Gold")
elif A == 0:
    print("Silver")
else:
    print("Alloy")
B - Weak Password【AC】

 全ての文字について条件が当てはまったらWeakとなります.よって,始めWeakだと仮定しておいて,一つずつ文字を見ていき,条件に外れたらFalseとします.そうすれば,1つも条件に外れない=全ての文字で条件が当てはまる なのでWeakと言えます.

A = input()
weak_same = True
weak_cont = True

for i in range(len(A)-1):
    if A[i] != A[i+1]:
        weak_same = False
    if int(A[i]) + 1 != int(A[i+1]) and not(A[i] == "9" and A[i+1] == "0"):
        weak_cont = False

if weak_cont or weak_same:
    print("Weak")
else:
    print("Strong")    
C - Min Difference【AC】

 A, Bについてソートしておき,iとjを順に増やしていきながらansを更新していきます.A_iとB_jについて,iとjどちらを+1すべきかについて,なるべくAとBの差を小さくなるように試す必要があるのでAとBで小さい方のインデックスを増やせば良いことが分かります.

N, M = map(int, input().split())
A = sorted([int(i) for i in input().split()])
B = sorted([int(i) for i in input().split()])
ans = 1<<60
i = 0
j = 0

while i < N and j < M:
    if abs(A[i] - B[j]) < ans:
        ans = abs(A[i] - B[j])
    else:
        if A[i] > B[j]:
            j += 1
        else:
            i += 1

print(ans)
D - Querying Multiset【AC】

 最小値の取り出しはO(log N)で出来るヒープを使えば良いです.ただし,xの加算に気をつける必要があります.全ての要素に+xしていってはO(N)かかるので恐らく間に合いません.よって,要素に加算するのではなくxという変数を用意しておいて,そこに加算しておくことにします.そして,出力するときに+xとすれば,今までのクエリの加算分を纏めて加算することになります.ただし,この方法だとpushの時に不都合が生じます.本来なら加算するべき所を加算せずに処理を続けているので,途中で加算クエリがきたあと,pushクエリが来たとき,加算分が足されることなく大小比較が行われ,最小値の計算が間違った物になります.よってpushするときに,本来加算されているはずのxを引いておくことで,大小比較を適切に行うことが出来ます.

import heapq

que = []
x = 0
for _ in range(int(input())):
    query = [int(i) for i in input().split()]
    if query[0] == 1:
        heapq.heappush(que, query[1]-x)
    elif query[0] == 2:
        x += query[1]
    else:
        print(heapq.heappop(que)+x)
A - Cabbages【AC】

 言われたとおりにやります

N, A, X, Y = map(int, input().split())
print(min(N, A)*X + max(0, N-A)*Y)
B - Bouzu Mekuri【AC】

 初めの1が偶数番目か奇数番目かで区別します.初めの1にしか興味が無いので,初めの1を見つけたらすぐbreakすることに気をつけます.

N = int(input())
S = input()

for i in range(N):
    if S[i] == "1":
        if i % 2 != 0:
            print("Aoki")
        else:
            print("Takahashi")
        break
C - Colorful Candies【AC】

 del dictは計算量O(1)であることを利用します.dict[i]=iの個数とし,dict[i]=0ならdel dict[i]とすることでdictの中から取り除きます.こうすることで,dictにある要素は全て1以上となり,len(dict)とすればkeyの数が返ってくるので,要素の種類数を求めることが出来ます.やってることはsetとほとんど同じですが,setはdelの操作ができないのでdictで代用しています.

N, K = map(int, input().split())
C = [int(i) for i in input().split()]

dic = {}
for i in range(K):
    dic.setdefault(C[i], 0)
    dic[C[i]] += 1
ans = len(dic)

for i in range(K, N):
    dic[C[i-K]] -= 1
    if dic[C[i-K]] == 0:
        del dic[C[i-K]]
    dic.setdefault(C[i], 0) 
    dic[C[i]] += 1
    ans = max(ans, len(dic))

print(ans)