5問でした。Fは桁DPでしょ、と実装したが「16通りの数字が既に出てるかどうかを記録」で6万になり、Nが2×10^5だから厳しいよな…TLEが解決せずコンテスト終了
def main():
N = int(input())
AS = list(map(int, input().split()))
sumAS = sum(AS)
sumSq = sum(a * a for a in AS)
print(N * sumSq - sumAS * sumAS)
- 期待値DP DP J
- f(x)を連結成分のサイズがxの状態からNになるまでの操作の回数の期待値とする。f(N) = 0。f(1)を求めたい
- f(x)が与えられたとしてf(x-1)を求める
- 連結成分のサイズがx-1の状態から1ステップ後を考える
- (x-1) / N の確率で既に連結してる頂点が選ばれて、残りの期待値はf(x-1)
- (N - (x-1)) / Nの確率で新しい頂点が選ばれて、残りの期待値はf(x)
- ここまで変形してコードに落とした py
def main():
N = int(input())
ret = 0
for i in range(1, N):
ret = (ret * (N - i) / N + 1) * N / (N - i)
print(ret)
- 公式解説
- をもう一歩整理すると
- になる
- 考えたこと
def main():
N, M = map(int, input().split())
AS = list(map(int, input().split()))
ft = FenwickTree(N)
for i in range(N):
ft.set(i, 1)
count = [0] * N
ret = INF = 9223372036854775807
for i in range(M):
v = AS[i]
count[v] += 1
ft.set(v, 0)
ret = ft.find_next(-1)
for i in range(M, N):
v = AS[i]
count[v] += 1
ft.set(v, 0)
v = AS[i - M]
count[v] -= 1
if count[v] == 0:
ft.set(v, 1)
ret = min(ret, ft.find_next(-1))
print(ret)