結果
| 問題 |
No.992 最長増加部分列の数え上げ
|
| コンテスト | |
| ユーザー |
qqqqq
|
| 提出日時 | 2020-02-18 21:11:36 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,235 ms / 2,000 ms |
| コード長 | 1,632 bytes |
| コンパイル時間 | 162 ms |
| コンパイル使用メモリ | 81,844 KB |
| 実行使用メモリ | 139,720 KB |
| 最終ジャッジ日時 | 2024-10-06 15:46:24 |
| 合計ジャッジ時間 | 29,627 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 42 |
ソースコード
import sys
input = lambda : sys.stdin.readline().strip()
mod = 10**9+7
class RangeMinimumQuery:
def __init__(self, n, F=min, e=float("inf"), fill=None):
self.n = n
self.n0 = 2**(n-1).bit_length()
self.F = F
self.e = e
if fill is None:
fill = e
self.data = [fill]*(2*self.n0)
def construct(self, a):
for i, x in enumerate(a):
self.data[i+self.n0-1] = x
for i in range(self.n0-2, -1, -1):
self.data[i] = self.F(self.data[2*i+1], self.data[2*i+2])
def query(self, l,r):
l += self.n0
r += self.n0
res = self.e
while l < r:
if r&1:
r -= 1
res = self.F(res, self.data[r-1])
if l&1:
res = self.F(res, self.data[l-1])
l += 1
l >>=1
r >>=1
return res
def update(self, i, x):
i += self.n0-1
self.data[i] = x
while i:
i = ~-i//2
self.data[i] = self.F(self.data[2*i+1], self.data[2*i+2])
def updater(a,b):
if a[0] == b[0]:
return (a[0], (a[1]+b[1])%mod)
elif a[0] > b[0]:
return a
else:
return b
n = int(input())
a = list(map(int, input().split()))
seg = RangeMinimumQuery(n, updater, (0,0), None)
b = [[ai, i] for i, ai in enumerate(a)]
b.sort(key=lambda x: (x[0], -x[1]))
for i in range(n):
_, j = b[i]
tmp = seg.query(0, j)
if tmp == (0,0):
seg.update(j, (tmp[0]+1, 1))
else:
seg.update(j, (tmp[0]+1, tmp[1]))
ans = seg.query(0, n)[1]
print(ans)
qqqqq