結果
| 問題 |
No.1649 Manhattan Square
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-07-28 21:48:24 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,366 ms / 3,000 ms |
| コード長 | 1,696 bytes |
| コンパイル時間 | 412 ms |
| コンパイル使用メモリ | 82,072 KB |
| 実行使用メモリ | 106,408 KB |
| 最終ジャッジ日時 | 2024-10-03 15:54:31 |
| 合計ジャッジ時間 | 50,750 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 43 |
ソースコード
import bisect
class BIT:
def __init__(self, n, func=int.__add__, one=0):
self.n = n
self.func = func
self.one = one
self.a = [0] * (self.n + 1)
self.all_sum = 0
def update(self, i, x):
i += 1
while i <= self.n:
self.a[i] = self.func(self.a[i], x)
i += i & (-i)
self.all_sum += x
def get(self, i):
s = self.one
while i != 0:
s = self.func(s, self.a[i])
i -= i & (-i)
return s
def out_get(self, i):
return self.all_sum - self.get(i)
n = int(input())
y_list = list()
point = list()
for _ in range(n):
x, y = map(int, input().split())
y_list.append(y)
point.append((x, y))
y_list.sort()
point.sort()
def compress_index(y):
idx = bisect.bisect_left(y_list, y)
return idx
mod = 998244353
one_bit = BIT(n)
x_plus_y_bit = BIT(n)
x_plus_y2_bit = BIT(n)
x_minus_y_bit = BIT(n)
x_minus_y2_bit = BIT(n)
ans = 0
for x, y in point:
y_idx = compress_index(y)
one = one_bit.get(y_idx)
x_plus_y = x_plus_y_bit.get(y_idx)
x_plus_y2 = x_plus_y2_bit.get(y_idx)
ans += (x + y) ** 2 * one - 2 * (x + y) * x_plus_y + x_plus_y2
ans %= mod
one = one_bit.out_get(y_idx)
x_minus_y = x_minus_y_bit.out_get(y_idx)
x_minus_y2 = x_minus_y2_bit.out_get(y_idx)
ans += (x - y) ** 2 * one - 2 * (x - y) * x_minus_y + x_minus_y2
ans %= mod
one_bit.update(y_idx, 1)
x_plus_y_bit.update(y_idx, (x + y) % mod)
x_plus_y2_bit.update(y_idx, (x + y) ** 2 % mod)
x_minus_y_bit.update(y_idx, (x - y) % mod)
x_minus_y2_bit.update(y_idx, (x - y) ** 2 % mod)
print(ans % mod)