結果
| 問題 |
No.121 傾向と対策:門松列(その2)
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-26 15:46:20 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 4,451 ms / 5,000 ms |
| コード長 | 3,135 bytes |
| コンパイル時間 | 296 ms |
| コンパイル使用メモリ | 82,432 KB |
| 実行使用メモリ | 297,548 KB |
| 最終ジャッジ日時 | 2025-03-26 15:46:46 |
| 合計ジャッジ時間 | 16,163 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 9 |
ソースコード
class FenwickTree:
def __init__(self, size):
self.size = size
self.tree = [0] * (self.size + 2) # 1-based indexing
def update(self, idx, delta):
idx += 1 # converting 0-based to 1-based
while idx <= self.size + 1:
self.tree[idx] += delta
idx += idx & -idx
def query(self, idx):
idx += 1 # converting 0-based to 1-based
res = 0
while idx > 0:
res += self.tree[idx]
idx -= idx & -idx
return res
def query_total(self):
return self.query(self.size)
def main():
import sys
input = sys.stdin.read().split()
n = int(input[0])
A = list(map(int, input[1:n+1]))
# Coordinate compression
sorted_unique = sorted(set(A))
compress_dict = {x: i for i, x in enumerate(sorted_unique)}
compressed_A = [compress_dict[x] for x in A]
m = len(sorted_unique)
# Initialize count_right and right_fenwick
count_right = [0] * m
for x in compressed_A:
count_right[x] += 1
right_fenwick = FenwickTree(m)
for x in compressed_A:
right_fenwick.update(x, 1)
# Initialize left_fenwick and count_left
left_fenwick = FenwickTree(m)
count_left = [0] * m
# Initialize prod_fenwick with count_left[x] * count_right[x]
prod_fenwick = FenwickTree(m)
for x in range(m):
initial_prod = count_left[x] * count_right[x]
prod_fenwick.update(x, initial_prod)
answer = 0
for j in range(n):
x = compressed_A[j]
# Step 1: Remove x from right_fenwick and update count_right
old_count_r = count_right[x]
count_right[x] -= 1
right_fenwick.update(x, -1)
# Update prod_fenwick for x due to count_right change
old_prod = count_left[x] * old_count_r
new_prod = count_left[x] * count_right[x]
delta_prod = new_prod - old_prod
prod_fenwick.update(x, delta_prod)
# Step 2: Compute L_less, L_greater, R_less, R_greater
L_less = left_fenwick.query(x - 1)
L_greater = left_fenwick.query_total() - left_fenwick.query(x)
R_less = right_fenwick.query(x - 1)
R_greater = right_fenwick.query_total() - right_fenwick.query(x)
# Step 3: Compute same_pairs_less and same_pairs_greater
same_pairs_less = prod_fenwick.query(x - 1)
same_pairs_greater = prod_fenwick.query_total() - prod_fenwick.query(x)
# Step 4: Calculate conditions and update answer
cond1 = L_less * R_less - same_pairs_less
cond2 = L_greater * R_greater - same_pairs_greater
answer += max(0, cond1) + max(0, cond2)
# Step 5: Add x to left_fenwick and update count_left
old_count_l = count_left[x]
count_left[x] += 1
left_fenwick.update(x, 1)
# Update prod_fenwick for x due to count_left change
old_prod_l = old_count_l * count_right[x]
new_prod_l = count_left[x] * count_right[x]
delta_prod_l = new_prod_l - old_prod_l
prod_fenwick.update(x, delta_prod_l)
print(answer)
if __name__ == '__main__':
main()
lam6er