結果
| 問題 |
No.1838 Modulo Straight
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-09 20:57:00 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,988 bytes |
| コンパイル時間 | 408 ms |
| コンパイル使用メモリ | 82,700 KB |
| 実行使用メモリ | 236,144 KB |
| 最終ジャッジ日時 | 2025-04-09 20:58:47 |
| 合計ジャッジ時間 | 7,510 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 7 TLE * 1 -- * 30 |
ソースコード
import sys
from collections import defaultdict
def main():
M, K = map(int, sys.stdin.readline().split())
A = list(map(int, sys.stdin.readline().split()))
MK = M * K
# Precompute S_v: for each value v, list of indices in order they appear
S = defaultdict(list)
for idx, num in enumerate(A):
S[num].append(idx)
for v in S:
S[v].sort() # Although they are appended in order, so already sorted
min_inv = float('inf')
for x in range(M):
# Generate for each value v the target positions for current x
target_pos = defaultdict(list)
for j in range(MK):
v_j = (x + j) % M
target_pos[v_j].append(j)
# Check if all target_pos[v] has exactly K elements (should always be true)
# Now, for each value v, sorted target positions are already in order
# For each element in original array, assign to the target positions in order
perm = [0] * MK
for v in target_pos:
tars = target_pos[v]
srcs = S[v]
for i in range(len(tars)):
perm[srcs[i]] = tars[i]
# Compute inversion count of perm
inv = 0
# Coordinate compression for Fenwick Tree
sorted_perm = sorted(set(perm))
rank = {v: i + 1 for i, v in enumerate(sorted_perm)}
size = len(sorted_perm)
fenwick = [0] * (size + 2)
for i in reversed(range(MK)):
p = rank[perm[i]]
# Query sum of elements < p
idx = p - 1
res = 0
while idx > 0:
res += fenwick[idx]
idx -= idx & -idx
inv += res
# Update Fenwick Tree
idx = p
while idx <= size:
fenwick[idx] += 1
idx += idx & -idx
if inv < min_inv:
min_inv = inv
print(min_inv)
if __name__ == "__main__":
main()
lam6er