結果
| 問題 |
No.2250 Split Permutation
|
| コンテスト | |
| ユーザー |
timi
|
| 提出日時 | 2023-03-22 10:05:59 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 384 ms / 3,000 ms |
| コード長 | 1,374 bytes |
| コンパイル時間 | 293 ms |
| コンパイル使用メモリ | 82,468 KB |
| 実行使用メモリ | 110,464 KB |
| 最終ジャッジ日時 | 2024-09-18 14:48:08 |
| 合計ジャッジ時間 | 6,688 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 |
ソースコード
N=int(input())
A=list(map(int, input().split()))
mod=998244353
B=A.copy()
def mergecount(A):
cnt = 0
n = len(A)
if n>1:
A1 = A[:n>>1]
A2 = A[n>>1:]
cnt += mergecount(A1)
cnt += mergecount(A2)
i1=0
i2=0
for i in range(n):
if i2 == len(A2):
A[i] = A1[i1]
i1 += 1
elif i1 == len(A1):
A[i] = A2[i2]
i2 += 1
elif A1[i1] <= A2[i2]:
A[i] = A1[i1]
i1 += 1
else:
A[i] = A2[i2]
i2 += 1
cnt += n//2 - i1
return cnt
al=mergecount(B)*(pow(2,N-1,mod))
al%=mod
class Bit:
def __init__(self, size):
self.data = [0] * (size + 1)
self.size = size
#i: index(0-index)までの和
def sum(self, i):
i+=2
s = 0
while i > 0:
s += self.data[i]
i -= i & -i
return s
def add(self, i, x):
i += 2
while i <= self.size:
self.data[i] += x
i += i & -i
C=[1]
for i in range(N):
c=C[-1]*2
c%=mod
C.append(c)
bit=Bit(N+10)
ans=0
for i in range(N):
a=A[i]
d=bit.sum(N+1)-bit.sum(a)
d%=mod
ans=ans*2+d
ans%=mod
bit.add(a,C[i])
#C=[]
#for j in range(N):
# C.append(bit.sum(j+1)-bit.sum(j))
#print(C)
print((al-ans)%mod)
timi