結果
| 問題 |
No.2568 列辞書順列列
|
| コンテスト | |
| ユーザー |
kemuniku
|
| 提出日時 | 2023-12-02 16:00:13 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 927 ms / 3,000 ms |
| コード長 | 2,154 bytes |
| コンパイル時間 | 256 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 114,176 KB |
| 最終ジャッジ日時 | 2024-09-26 19:40:43 |
| 合計ジャッジ時間 | 22,523 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 25 |
ソースコード
class SegmentTree:
def __init__(self, v,marge,default=0):
self.default = default
self.marge = marge
self.lastnode = 1
while self.lastnode < len(v):
self.lastnode*=2
#1-indexedで作成する
self.array = [self.default] *(2*self.lastnode)
for i in range(len(v)):
self.array[self.lastnode+i] = v[i]
for i in range(self.lastnode-1,-1,-1):
self.array[i] = self.marge(self.array[2*i],self.array[2*i+1])
def update(self,x,val):
x += self.lastnode
self.array[x] = val
while x>0:
x >>=1
self.array[x] = self.marge(self.array[2*x],self.array[2*x+1])
def get(self,q_left,q_right):
q_left += self.lastnode
q_right += self.lastnode
lres,rres = self.default,self.default
while q_left < q_right:
if q_left&1:
lres = self.marge(lres,self.array[q_left])
q_left += 1
if q_right&1:
q_right -= 1
rres = self.marge(self.array[q_right],rres)
q_left >>= 1
q_right>>= 1
return self.marge(lres,rres)
def __getitem__(self,x):
x += self.lastnode
return self.array[x]
def binary_search(self,val):
if self.array[1] < val:
return -1
i = 2
now = 0
while i < 2*self.lastnode:
if self.marge(now,self.array[i]) <val:
now = self.marge(now,self.array[i])
i +=1
i<<=1
return (i>>1) - self.lastnode
N,M,Q = map(int,input().split())
def merge(x,y):
return ((x[0]*pow(M,y[1],998244353)%998244353+y[0])%998244353,x[1]+y[1])
A = list(map(int,input().split()))
V = [(a-1,1) for a in A]
st = SegmentTree(V,merge,(0,0))
for i in range(Q):
l,r = map(int,input().split())
l-=1
print((st.get(l,r)[0]+1)%998244353)
kemuniku