hirohirohirohirosのブログ

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

Atcoder ABC248 振り返り

A - Lacked Number【AC】

 not inと書くことで,含まれていないときTrueが返ってきます.

N = input()
for i in range(10):
    if str(i) not in N:
        print(i)
        break
B - Slimes【AC】

 ドラえもんバイバインの回を知っていれば,たとえK=2でも一瞬で10^9を超えちゃう事がイメージできます.

A, B, K = map(int, input().split())
ans = 0

while A < B :
    A *= K
    ans += 1
print(ans)
C - Dice Sum【解説AC】

 DPが苦手すぎる……アルゴ式か何かでDPの徹底訓練をする必要がありそうです……
 dp[i][j]=i項目まで値を決めたとき合計がjになる数列の個数
と定義します.1項目の値を決めたとき合計がjになる数列の個数は一つなのでdp[0][j]を1とします.

N, M, K = map(int, input().split())
dp = [[0 for _ in range(K+1)] for _ in range(N)]
MOD = 998244353 
for i in range(1, M+1):
    dp[0][i] = 1

for i in range(N-1):
    for k in range(K+1):
        for m in range(1, M+1):
            if m+k <= K:
                dp[i+1][m+k] += dp[i][k]
                dp[i+1][m+k] %= MOD

print(sum(dp[-1]) % MOD)
D - Range Count Query【AC】

 累積和的な考えで解きました.i番目に値Xが出現したらlist[X][i]に+1し,それぞれのlist[X]に対して累積和的を取ったら,cumsum[X][R]-cumsum[X][L]で求めることが出来ます.
 しかし,これだとリストにNXの要素を持つ事が必要になり,時間が足りません.そこで,i番目に値Xが出現したらlist[X]にiをappendします.そして,LとRがlist[X]の何番目に存在するかを二分探索で求めれば,ただしい解を出すことが出来ます.

import bisect

N = int(input())
A = [int(i) for i in input().split()]
cumsum_dic = {a:[] for a in set(A)}
for i, a in enumerate(A):
    cumsum_dic[a].append(i)

for _ in range(int(input())):
    L, R, X = map(int, input().split())
    L, R = L-1, R-1
    try:
        cumsum = cumsum_dic[X]
        left = bisect.bisect_left(cumsum, L)
        right = bisect.bisect_right(cumsum, R)
        print(right - left)
    except KeyError:
        print(0)