結果
問題 | No.878 Range High-Element Query |
ユーザー | nagiss |
提出日時 | 2019-09-06 23:23:30 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 389 ms / 2,000 ms |
コード長 | 2,346 bytes |
コンパイル時間 | 428 ms |
コンパイル使用メモリ | 86,956 KB |
実行使用メモリ | 109,832 KB |
最終ジャッジ日時 | 2023-09-07 02:38:02 |
合計ジャッジ時間 | 5,501 ms |
ジャッジサーバーID (参考情報) |
judge15 / judge12 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 75 ms
71,360 KB |
testcase_01 | AC | 97 ms
77,464 KB |
testcase_02 | AC | 105 ms
77,724 KB |
testcase_03 | AC | 100 ms
77,512 KB |
testcase_04 | AC | 101 ms
77,492 KB |
testcase_05 | AC | 108 ms
76,820 KB |
testcase_06 | AC | 86 ms
76,192 KB |
testcase_07 | AC | 82 ms
75,684 KB |
testcase_08 | AC | 102 ms
77,724 KB |
testcase_09 | AC | 100 ms
77,672 KB |
testcase_10 | AC | 96 ms
76,868 KB |
testcase_11 | AC | 372 ms
103,080 KB |
testcase_12 | AC | 322 ms
104,052 KB |
testcase_13 | AC | 330 ms
98,168 KB |
testcase_14 | AC | 299 ms
94,276 KB |
testcase_15 | AC | 332 ms
102,452 KB |
testcase_16 | AC | 356 ms
106,800 KB |
testcase_17 | AC | 389 ms
109,200 KB |
testcase_18 | AC | 371 ms
109,832 KB |
ソースコード
class Lca: # 最近共通祖先 def __init__(self, E, root): import sys sys.setrecursionlimit(500000) self.root = root self.E = E # V<V> self.n = len(E) # 頂点数 self.logn = 1 # n < 1<<logn ぴったりはだめ while self.n >= (1<<self.logn): self.logn += 1 # parent[n][v] = ノード v から 1<<n 個親をたどったノード self.parent = [[-1]*self.n for _ in range(self.logn)] self.depth = [0] * self.n self.dfs(root, -1, 0) for k in range(self.logn-1): for v in range(self.n): p_ = self.parent[k][v] if p_ >= 0: self.parent[k+1][v] = self.parent[k][p_] def dfs(self, v, p, dep): # ノード番号、親のノード番号、深さ self.parent[0][v] = p self.depth[v] = dep for e in self.E[v]: if e != p: self.dfs(e, v, dep+1) def get(self, u, v): if self.depth[u] > self.depth[v]: u, v = v, u # self.depth[u] <= self.depth[v] dep_diff = self.depth[v]-self.depth[u] for k in range(self.logn): if dep_diff >> k & 1: v = self.parent[k][v] if u==v: return u for k in range(self.logn-1, -1, -1): if self.parent[k][u] != self.parent[k][v]: u = self.parent[k][u] v = self.parent[k][v] return self.parent[0][u] N, Q = map(int, input().split()) A = list(map(int, input().split())) E = [[] for _ in range(N+1)] st = [] # 中身は常に降順 for i, a in enumerate(A): while st: i_, a_ = st.pop() if a_ < a: E[i].append(i_) E[i_].append(i) else: st.append((i_, a_)) break st.append((i, a)) for s, a in st: E[N].append(s) E[s].append(N) lca = Lca(E, N) # parent[n][v] = ノード v から 1<<n 個親をたどったノード parent = lca.parent Ans = [] for _ in range(Q): _, l, r = map(int, input().split()) l -= 1 r -= 1 ans = 0 v = l for par in parent[::-1]: if par[v] <= r and par[v]!=-1: v = par[v] ans += 1 ans <<= 1 ans >>= 1 Ans.append(ans+1) print("\n".join(map(str, Ans)))