結果
問題 | No.2759 Take Pictures, Elements? |
ユーザー |
|
提出日時 | 2024-05-17 21:57:34 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 591 ms / 2,000 ms |
コード長 | 4,325 bytes |
コンパイル時間 | 375 ms |
コンパイル使用メモリ | 82,148 KB |
実行使用メモリ | 78,124 KB |
最終ジャッジ日時 | 2024-12-20 13:43:01 |
合計ジャッジ時間 | 7,880 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 |
ソースコード
class SegTree:def __init__(self, arr, op, e):self._n = len(arr)self._op = opself._e = eself._size = 1 << (self._n - 1).bit_length()self._tree = [self._e] * (2 * self._size)for i in range(self._n):self._tree[self._size + i] = arr[i]for i in range(self._size - 1, 0, -1):self._update(i)def get(self, k):# assert 0 <= k < self._nif 0 <= k < self._n:return self._tree[k + self._size]return self._edef set(self, k, x):# assert 0 <= k < self._nif not 0 <= k < self._n:returnk += self._sizeself._tree[k] = xwhile k > 1:self._tree[k >> 1] = self._op(self._tree[k], self._tree[k ^ 1])k >>= 1def all_prod(self):return self._tree[1]def prod(self, l, r):# assert 0 <= l <= r <= self._nl = max(l, 0)r = min(r, self._n)if l > r:return self._eres_l = res_r = self._el += self._sizer += self._sizewhile l < r:if l & 1:res_l = self._op(res_l, self._tree[l])l += 1if r & 1:r -= 1res_r = self._op(self._tree[r], res_r)l >>= 1r >>= 1return self._op(res_l, res_r)def max_right(self, l, f):'''f(op(a[l], a[l + 1], ..., a[r - 1])) = True となる最大の r'''# assert 0 <= l <= self._nif not 0 <= l <= self._n:return self._nassert f(self._e)if l == self._n:return self._nl += self._sizeres = self._efirst = Truewhile first or (l & -l) != l:first = Falsewhile l % 2 == 0:l >>= 1if not f(self._op(res, self._tree[l])):while l < self._size:l *= 2if f(self._op(res, self._tree[l])):res = self._op(res, self._tree[l])l += 1return l - self._sizeres = self._op(res, self._tree[l])l += 1return self._ndef min_left(self, r, f):'''f(op(a[l], a[l + 1], ..., a[r - 1])) = true となる最小の l'''# assert 0 <= r <= self._nif not 0 <= r <= self._n:return 0assert f(self._e)if r == 0:return 0r += self._sizeres = self._efirst = Truewhile first or (r & -r) != r:first = Falser -= 1while r > 1 and r % 2:r >>= 1if not f(self._op(self._tree[r], res)):while r < self._size:r = 2 * r + 1if f(self._op(self._tree[r], res)):res = self._op(self._tree[r], res)r -= 1return r + 1 - self._sizeres = self._op(self._tree[r], res)return 0def chmin(self, k, x):self[k] = min(self[k], x)def chmax(self, k, x):self[k] = max(self[k], x)def _update(self, k):self._tree[k] = self._op(self._tree[2 * k], self._tree[2 * k + 1])def __getitem__(self, k):return self.get(k)def __setitem__(self, k, x):self.set(k, x)def __iter__(self):for i in range(self._n):yield self[i]def __str__(self):return str(list(self))N, Q = map(int, input().split())A = list(map(int, input().split()))B = list(map(int, input().split()))INF = 1 << 60ans = [INF] * Nl_seg = SegTree([INF] * N, min, INF)r_seg = SegTree([INF] * N, min, INF)l_seg[0] = r_seg[0] = 0ans[0] = 0for b in B:to_inf = []for i, a in enumerate(A):if a == b:best = min(l_seg.prod(0, i) + i, r_seg.prod(i, N) - i)ans[i] = bestl_seg[i] = best - ir_seg[i] = best + ielse:to_inf.append(i)while to_inf:i = to_inf.pop()l_seg[i] = r_seg[i] = INFans[i] = INFprint(min(ans))