結果
| 問題 | No.2250 Split Permutation |
| コンテスト | |
| ユーザー |
detteiuu
|
| 提出日時 | 2026-08-29 16:42:37 |
| 言語 | PyPy3 (7.3.23) |
| 結果 |
AC
|
| 実行時間 | 465 ms / 3,000 ms |
| + 342µs | |
| コード長 | 1,271 bytes |
| 記録 | |
| コンパイル時間 | 245 ms |
| コンパイル使用メモリ | 95,980 KB |
| 実行使用メモリ | 160,640 KB |
| 最終ジャッジ日時 | 2026-08-29 16:42:50 |
| 合計ジャッジ時間 | 10,336 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 |
ソースコード
class BIT:
def __init__(self, A):
self.size = len(A)
self.bit = [0]*(len(A)+1)
for i in range(len(A)):
self.add(i, A[i])
def sum(self, i):
i += 1
ans = 0
while i > 0:
ans += self.bit[i]
ans %= MOD
i -= -i&i
return ans
def query(self, l, r):
if l == 0:
return self.sum(r-1)
else:
return (self.sum(r-1)-self.sum(l-1))%MOD
def add(self, i, x):
i += 1
while i <= self.size:
self.bit[i] += x
self.bit[i] %= MOD
i += -i&i
MOD = 998244353
POW = [1]
iPOW = [1]
half = pow(2, -1, MOD)
for _ in range(10**5*2):
POW.append(POW[-1]*2%MOD)
iPOW.append(iPOW[-1]*half%MOD)
N = int(input())
P = list(map(int, input().split()))
A = sorted(enumerate(P), key=lambda x:x[1])
B = BIT([0]*N)
cnt = 0
for idx, p in A:
if idx+1 < N:
res = B.query(idx+1, N)*POW[idx]%MOD
cnt += res
cnt %= MOD
B.add(idx, iPOW[idx])
cnt *= POW[N-1]
cnt %= MOD
inversion = 0
B = BIT([0]*N)
for p in P:
p -= 1
if p+1 < N:
inversion += B.query(p+1, N)
inversion %= MOD
B.add(p, 1)
print((inversion*POW[N-1]%MOD-cnt)%MOD)
detteiuu