結果
問題 | No.2930 Larger Mex |
ユーザー |
|
提出日時 | 2024-10-12 20:37:04 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 413 ms / 2,000 ms |
コード長 | 1,962 bytes |
コンパイル時間 | 470 ms |
コンパイル使用メモリ | 82,048 KB |
実行使用メモリ | 112,384 KB |
最終ジャッジ日時 | 2024-10-12 20:37:24 |
合計ジャッジ時間 | 19,808 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 50 |
ソースコード
class SegTree:def __init__(self, op, e, n, v=None):self._n = nself._op = opself._e = eself._log = (n - 1).bit_length()self._size = 1 << self._logself._d = [self._e()] * (self._size << 1)if v is not None:for i in range(self._n):self._d[self._size + i] = v[i]for i in range(self._size - 1, 0, -1):self._d[i] = self._op(self._d[i << 1], self._d[i << 1 | 1])def set(self, p, x):p += self._sizeself._d[p] = xwhile p:l, r = p, p^1if l > r: l, r = r, lself._d[p >> 1] = self._op(self._d[l], self._d[r])p >>= 1def get(self, p):return self._d[p + self._size]#[l, r)の区間で求めるdef prod(self, l, r):sml, smr = self._e(), self._e()l += self._sizer += self._sizewhile l < r:if l & 1:sml = self._op(sml, self._d[l])l += 1if r & 1:r -= 1smr = self._op(self._d[r], smr)l >>= 1r >>= 1return self._op(sml, smr)def all_prod(self):return self._d[1]INF = 10**9def op(x, y):return min(x, y)def e():return INFimport sysinput = sys.stdin.readlineN, M = map(int,input().split())A = list(map(int, input().split()))if M==0:for i in range(N):print(N-i)exit()ST = SegTree(op, e, M, [0 for _ in range(M)])i = 0j = 0dp = [0 for _ in range(N+2)]while i<N:while j<N and ST.all_prod()==0:if A[j]<M:v = ST.get(A[j])ST.set(A[j], v+1)j+=1if ST.all_prod()>0:dp[j-i] += 1dp[N+1-i] -= 1if A[i]<M:v = ST.get(A[i])ST.set(A[i], v-1)i+=1ans = [0]for d in dp[1:]:ans.append(ans[-1]+d)for i in range(1, N+1):print(ans[i])