結果
| 問題 |
No.1996 <><
|
| コンテスト | |
| ユーザー |
👑 SPD_9X2
|
| 提出日時 | 2022-07-01 22:12:42 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,559 ms / 2,000 ms |
| コード長 | 1,633 bytes |
| コンパイル時間 | 312 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 95,164 KB |
| 最終ジャッジ日時 | 2024-11-26 05:23:05 |
| 合計ジャッジ時間 | 19,470 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 29 |
ソースコード
"""
dp[i][j] = i番目までで、j個の場合の数
dp[i未満][j-1] から推移できる
ただし、A[?] < A[i] or A[?] > A[i] の時だけ
K個の セグ木に載せれば解ける
"""
from sys import stdin
mod = 10**9+7
class BIT:
def __init__(self,N,indexed): #0-indexed or 1-indexed 指定可能
self.bit = [0] * (N+3)
self.mode = indexed
def add(self,a,w): #aにwを加える(1-origin)
x = a + (1-self.mode)
while x <= (len(self.bit)-1):
self.bit[x] += w
self.bit[x] %= mod
x += x & (-1 * x)
#print (self.bit)
def bitsum(self,a): #ind 1~aまでの和を求める
ret = 0
x = a + (1-self.mode)
while x > 0:
ret += self.bit[x]
x -= x & (-1 * x)
return ret % mod
def sum(self,l,r):
ret = self.bitsum(r-1) - self.bitsum(l-1)
return ret
N,K = map(int,stdin.readline().split())
A = list(map(int,stdin.readline().split()))
s = list(stdin.readline()[:-1])
adic = {}
alis = []
for i in A:
if i not in adic:
adic[i] = 0
alis.append(i)
alis.sort()
for i in range(len(alis)):
adic[alis[i]] = i
A = [ adic[i] for i in A ]
XXX = len(adic) + 2
bit = [BIT(XXX,0) for i in range(K+1)]
for i in range(N):
for j in range(K,0,-1):
if s[j-1] == "<":
now = bit[j-1].sum(0,A[i])
bit[j].add(A[i], now % mod )
else:
now = bit[j-1].sum(A[i]+1,XXX)
bit[j].add(A[i], now % mod )
bit[0].add(A[i],1)
print (bit[K].sum(0,XXX) % mod)
SPD_9X2