結果
問題 | No.992 最長増加部分列の数え上げ |
ユーザー |
![]() |
提出日時 | 2020-10-31 06:51:12 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,017 ms / 2,000 ms |
コード長 | 1,753 bytes |
コンパイル時間 | 186 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 183,540 KB |
最終ジャッジ日時 | 2024-07-22 04:39:41 |
合計ジャッジ時間 | 27,403 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 42 |
ソースコード
n = int(input())A = list(map(int, input().split()))mod = 10**9+7d = {}B = list(set(A))B.sort()for i, b in enumerate(B):d[b] = i+1A = [d[a] for a in A]class SegTree:def __init__(self, init_val, ide_ele, segfunc):self.n = len(init_val)self.num = 2**(self.n-1).bit_length()self.ide_ele = ide_eleself.segfunc = segfuncself.seg = [ide_ele]*2*self.num# set_valfor i in range(self.n):self.seg[i+self.num] = init_val[i]# builtfor i in range(self.num-1, 0, -1):self.seg[i] = self.segfunc(self.seg[2*i], self.seg[2*i+1])def update(self, k, x):k += self.numself.seg[k] = xwhile k:k = k >> 1self.seg[k] = self.segfunc(self.seg[2*k], self.seg[2*k+1])def query(self, l, r):if r <= l:return self.ide_elel += self.numr += self.numlres = self.ide_elerres = self.ide_elewhile l < r:if r & 1:r -= 1rres = self.segfunc(self.seg[r], rres)if l & 1:lres = self.segfunc(lres, self.seg[l])l += 1l = l >> 1r = r >> 1res = self.segfunc(lres, rres)return resdef segfunc(x, y):if x[0] == y[0]:return (x[0], x[1]+y[1])elif x[0] > y[0]:return xelse:return yseg = SegTree([(-1, 0)]*(n+1), (-1, 0), segfunc)seg.update(0, (0, 1))for a in A:x = seg.query(a, a+1)y = seg.query(0, a)if y[0] < x[0]:seg.update(a, (x[0], y[1]+x[1]))else:seg.update(a, (y[0]+1, y[1]))ans = seg.query(0, n+1)print(ans[1]%mod)