結果
問題 | No.878 Range High-Element Query |
ユーザー | nagiss |
提出日時 | 2019-09-06 23:23:30 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 358 ms / 2,000 ms |
コード長 | 2,346 bytes |
コンパイル時間 | 390 ms |
コンパイル使用メモリ | 82,044 KB |
実行使用メモリ | 107,764 KB |
最終ジャッジ日時 | 2024-06-24 21:21:04 |
合計ジャッジ時間 | 4,681 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 39 ms
53,200 KB |
testcase_01 | AC | 70 ms
69,340 KB |
testcase_02 | AC | 72 ms
74,152 KB |
testcase_03 | AC | 66 ms
70,552 KB |
testcase_04 | AC | 67 ms
70,916 KB |
testcase_05 | AC | 74 ms
71,980 KB |
testcase_06 | AC | 52 ms
62,120 KB |
testcase_07 | AC | 49 ms
60,060 KB |
testcase_08 | AC | 68 ms
71,852 KB |
testcase_09 | AC | 68 ms
70,536 KB |
testcase_10 | AC | 62 ms
67,260 KB |
testcase_11 | AC | 337 ms
101,584 KB |
testcase_12 | AC | 287 ms
101,816 KB |
testcase_13 | AC | 295 ms
95,796 KB |
testcase_14 | AC | 258 ms
93,548 KB |
testcase_15 | AC | 294 ms
100,876 KB |
testcase_16 | AC | 328 ms
106,080 KB |
testcase_17 | AC | 358 ms
107,764 KB |
testcase_18 | AC | 340 ms
106,644 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)))