結果
問題 | No.1031 いたずら好きなお姉ちゃん |
ユーザー |
![]() |
提出日時 | 2020-04-17 23:09:22 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 664 ms / 3,500 ms |
コード長 | 2,100 bytes |
コンパイル時間 | 169 ms |
コンパイル使用メモリ | 82,072 KB |
実行使用メモリ | 116,032 KB |
最終ジャッジ日時 | 2024-10-03 15:07:51 |
合計ジャッジ時間 | 20,024 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 53 |
ソースコード
#!/usr/bin/ python3.8import sysread = sys.stdin.buffer.readreadline = sys.stdin.buffer.readlinereadlines = sys.stdin.buffer.readlinesclass SegTree:""" segment tree with point modification and range product access. """data_unit = 1 << 30data_f = mindef __init__(self, N):self.N = Nself.data = [self.data_unit] * (N + N)def build(self, raw_data):data = self.dataf = self.data_fN = self.Ndata[N:] = raw_data[:]for i in range(N - 1, 0, -1):data[i] = f(data[i << 1], data[i << 1 | 1])def set_val(self, i, x):data = self.dataf = self.data_fi += self.Ndata[i] = xwhile i > 1:i >>= 1data[i] = f(data[i << 1], data[i << 1 | 1])def fold(self, L, R):""" compute for [L, R) """vL = vR = self.data_unitdata = self.dataf = self.data_fL += self.NR += self.Nwhile L < R:if L & 1:vL = f(vL, data[L])L += 1if R & 1:R -= 1vR = f(data[R], vR)L >>= 1R >>= 1return f(vL, vR)N, *A = map(int, read().split())def solve(A):# 小・大の順A = [0] + A + [N + 1]stack = [N + 1]seg = SegTree(len(A))seg.build(A)next_high = [N + 1] * (N + 2)for n in range(N, -1, -1):x = A[n]while x > A[stack[-1]]:stack.pop()next_high[n] = stack[-1]stack.append(n)dp = [None] * 17dp[0] = next_highfor n in range(1, 17):prev = dp[n - 1]dp[n] = [prev[prev[i]] for i in range(N + 2)]def bin_search(i):a = A[i]R = len(A) - 2ret = 0for n in range(16, -1, -1):m = dp[n][i]if m <= R and seg.fold(i + 1, m) >= a:ret += 1 << ni = mreturn retreturn sum(bin_search(i) for i in range(1, N + 1))print(solve(A) + solve(A[::-1]))