結果
問題 | No.1996 <>< |
ユーザー | SidewaysOwl |
提出日時 | 2022-07-01 23:02:35 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,770 ms / 2,000 ms |
コード長 | 2,243 bytes |
コンパイル時間 | 1,844 ms |
コンパイル使用メモリ | 86,536 KB |
実行使用メモリ | 131,072 KB |
最終ジャッジ日時 | 2023-08-17 10:42:05 |
合計ジャッジ時間 | 23,076 ms |
ジャッジサーバーID (参考情報) |
judge12 / judge11 |
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 91 ms
71,572 KB |
testcase_01 | AC | 87 ms
71,460 KB |
testcase_02 | AC | 93 ms
75,828 KB |
testcase_03 | AC | 109 ms
77,240 KB |
testcase_04 | AC | 87 ms
71,544 KB |
testcase_05 | AC | 85 ms
71,612 KB |
testcase_06 | AC | 86 ms
71,368 KB |
testcase_07 | AC | 93 ms
75,996 KB |
testcase_08 | AC | 154 ms
79,212 KB |
testcase_09 | AC | 108 ms
77,188 KB |
testcase_10 | AC | 158 ms
78,580 KB |
testcase_11 | AC | 814 ms
102,808 KB |
testcase_12 | AC | 1,416 ms
127,300 KB |
testcase_13 | AC | 1,770 ms
131,072 KB |
testcase_14 | AC | 1,694 ms
128,696 KB |
testcase_15 | AC | 1,483 ms
122,512 KB |
testcase_16 | AC | 1,312 ms
117,584 KB |
testcase_17 | AC | 1,495 ms
123,128 KB |
testcase_18 | AC | 941 ms
108,500 KB |
testcase_19 | AC | 1,095 ms
109,624 KB |
testcase_20 | AC | 1,060 ms
107,896 KB |
testcase_21 | AC | 1,307 ms
118,744 KB |
testcase_22 | AC | 1,465 ms
121,628 KB |
testcase_23 | AC | 215 ms
81,628 KB |
testcase_24 | AC | 944 ms
111,184 KB |
testcase_25 | AC | 525 ms
90,812 KB |
testcase_26 | AC | 801 ms
103,888 KB |
testcase_27 | AC | 304 ms
84,676 KB |
testcase_28 | AC | 130 ms
77,968 KB |
testcase_29 | AC | 506 ms
89,464 KB |
testcase_30 | AC | 173 ms
80,132 KB |
testcase_31 | AC | 345 ms
86,696 KB |
testcase_32 | AC | 169 ms
78,784 KB |
ソースコード
class SegmrntTree: def __init__(self,arr,func,i_ele): self.i_ele = i_ele self.func = func arr_len = len(arr) self.tree_len = 2 ** (arr_len-1).bit_length() * 2 self.tree = [i_ele] * self.tree_len for i in range(arr_len): self.tree[i + self.tree_len // 2] = arr[i] for i in range(self.tree_len // 2 -1,0,-1): self.tree[i] = func(self.tree[i * 2],self.tree[i * 2 + 1]) def query_range(self,l,r): res = self.i_ele l += self.tree_len // 2 - 1 r += self.tree_len // 2 while l < r: if l & 1: res = self.func(res,self.tree[l]) l += 1 if r & 1: res = self.func(res,self.tree[r-1]) r -= 1 l >>= 1 r >>= 1 return res def query(self,l): return self.tree[l + self.tree_len // 2 - 1] def update(self,l,x): l += self.tree_len // 2 - 1 self.tree[l] = self.func(x,self.tree[l]) def calc(l): if l & 1: l -=1 return l >> 1 while calc(l): if l & 1: self.tree[calc(l)] = self.func(self.tree[l],self.tree[l-1]) else: self.tree[calc(l)] = self.func(self.tree[l],self.tree[l+1]) l = calc(l) n,k = map(int,input().split()) a = list(map(int,input().split())) s = list(input()) from collections import defaultdict d = defaultdict(int) d[0] = 1 for i,e in enumerate(sorted(set(a)),start=2): d[e] = i d[10**20] = len(d) + 1 nn = len(d) dp = [] mod = 10 ** 9 + 7 def sum_(x,y): return (x + y) % mod for i in range(k+1): dp.append(SegmrntTree([0]*nn,sum_,0)) for i in range(1,n+1): idx = d[a[i-1]] dp[0].update(idx,1) for j in range(1,k+1): if s[j-1] == "<": down = dp[j-1].query_range(1,idx-1) dp[j].update(idx,down) else: up = dp[j-1].query_range(idx+1,nn) dp[j].update(idx,up) # for j in range(k+1): # print(dp[j].tree) # print() ans = 0 for i in range(1,nn): ans += dp[k].query(i) # print(dp[k].query(i+1)) ans %= mod print(ans)