結果
問題 | No.1996 <>< |
ユーザー |
👑 ![]() |
提出日時 | 2022-07-01 22:05:26 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,086 bytes |
コンパイル時間 | 470 ms |
コンパイル使用メモリ | 82,228 KB |
実行使用メモリ | 115,012 KB |
最終ジャッジ日時 | 2024-11-26 05:15:55 |
合計ジャッジ時間 | 32,862 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 21 TLE * 8 |
ソースコード
"""dp[i][j] = i番目までで、j個の場合の数dp[i未満][j-1] から推移できるただし、A[?] < A[i] or A[?] > A[i] の時だけK個の セグ木に載せれば解ける"""from sys import stdinmod = 10**9+7class RangeBIT:def __init__(self,N,indexed): #0-indexed or 1-indexed 指定可能self.bit1 = [0] * (N+2)self.bit2 = [0] * (N+2)self.mode = indexeddef bitadd(self,a,w,bit): #aにwを加える(1-origin)x = awhile x <= (len(bit)-1):bit[x] += wbit[x] %= modx += x & (-1 * x)def bitsum(self,a,bit): #ind 1~aまでの和を求めるret = 0x = awhile x > 0:ret += bit[x]x -= x & (-1 * x)return ret % moddef add(self,l,r,w): #半開区間[l,r)にwを加えるl = l + (1-self.mode)r = r + (1-self.mode)self.bitadd(l,-1*w*l,self.bit1)self.bitadd(r,w*r,self.bit1)self.bitadd(l,w,self.bit2)self.bitadd(r,-1*w,self.bit2)def sum(self,l,r): #半開区間[l,r)の区間和l = l + (1-self.mode)r = r + (1-self.mode)ret = self.bitsum(r,self.bit1) + r * self.bitsum(r,self.bit2)ret -= self.bitsum(l,self.bit1) + l * self.bitsum(l,self.bit2)return retN,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] = 0alis.append(i)alis.sort()for i in range(len(alis)):adic[alis[i]] = iA = [ adic[i] for i in A ]XXX = len(adic) + 2bit = [RangeBIT(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],A[i]+1, now % mod )else:now = bit[j-1].sum(A[i]+1,XXX)bit[j].add(A[i],A[i]+1, now % mod )bit[0].add(A[i],A[i]+1,1)print (bit[K].sum(0,XXX) % mod)