結果
問題 |
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 = n self._op = op self._e = e self._log = (n - 1).bit_length() self._size = 1 << self._log self._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._size self._d[p] = x while p: l, r = p, p^1 if l > r: l, r = r, l self._d[p >> 1] = self._op(self._d[l], self._d[r]) p >>= 1 def get(self, p): return self._d[p + self._size] #[l, r)の区間で求める def prod(self, l, r): sml, smr = self._e(), self._e() l += self._size r += self._size while l < r: if l & 1: sml = self._op(sml, self._d[l]) l += 1 if r & 1: r -= 1 smr = self._op(self._d[r], smr) l >>= 1 r >>= 1 return self._op(sml, smr) def all_prod(self): return self._d[1] INF = 10**9 def op(x, y): return min(x, y) def e(): return INF import sys input = sys.stdin.readline N, 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 = 0 j = 0 dp = [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+=1 if ST.all_prod()>0: dp[j-i] += 1 dp[N+1-i] -= 1 if A[i]<M: v = ST.get(A[i]) ST.set(A[i], v-1) i+=1 ans = [0] for d in dp[1:]: ans.append(ans[-1]+d) for i in range(1, N+1): print(ans[i])