結果
| 問題 |
No.694 square1001 and Permutation 3
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-31 17:36:40 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 2,473 bytes |
| コンパイル時間 | 192 ms |
| コンパイル使用メモリ | 82,844 KB |
| 実行使用メモリ | 258,480 KB |
| 最終ジャッジ日時 | 2025-03-31 17:37:26 |
| 合計ジャッジ時間 | 7,960 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 10 MLE * 3 |
ソースコード
import sys
from bisect import bisect_left
def main():
sys.setrecursionlimit(1 << 25)
n = int(sys.stdin.readline())
A = [int(sys.stdin.readline()) for _ in range(n)]
if n == 0:
return
# Coordinate compression and prepare sorted_unique
sorted_unique = sorted(set(A))
sorted_unique.sort()
m = len(sorted_unique)
# Frequency dictionary
freq = {}
for num in A:
if num in freq:
freq[num] += 1
else:
freq[num] = 1
# Build prefix_counts for elements_less calculation
prefix_counts = []
current = 0
for num in sorted_unique:
current += freq[num]
prefix_counts.append(current)
# Precompute X and Y for each element in A
X = []
Y = []
for num in A:
# Compute elements_less
idx = bisect_left(sorted_unique, num) - 1
elements_less = prefix_counts[idx] if idx >= 0 else 0
# Compute elements_greater
count_num = freq[num]
elements_greater = n - elements_less - count_num
X.append(elements_less)
Y.append(elements_greater)
# Compute initial inversion count using Fenwick Tree
class FenwickTree:
def __init__(self, size):
self.size = size
self.tree = [0] * (self.size + 2) # 1-based indexing
def update(self, idx, delta=1):
while idx <= self.size:
self.tree[idx] += delta
idx += idx & -idx
def query(self, idx):
res = 0
while idx > 0:
res += self.tree[idx]
idx -= idx & -idx
return res
# Create a rank map for coordinate compression
rank_map = {num: i+1 for i, num in enumerate(sorted_unique)} # 1-based ranks
max_rank = len(sorted_unique)
ft = FenwickTree(max_rank)
inv_initial = 0
for i in reversed(range(n)):
num = A[i]
current_rank = rank_map[num]
# Number of elements already in the tree (to the right) that are less than current_num
cnt = ft.query(current_rank - 1)
inv_initial += cnt
ft.update(current_rank)
# Compute answers
ans = [0] * n
ans[0] = inv_initial
for k in range(1, n):
ans[k] = ans[k-1] - X[k-1] + Y[k-1]
# Output the answers
for val in ans:
print(val)
if __name__ == "__main__":
main()
lam6er