結果
| 問題 |
No.1864 Shortest Paths Counting
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-01-08 21:04:12 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 919 ms / 2,000 ms |
| コード長 | 1,728 bytes |
| コンパイル時間 | 262 ms |
| コンパイル使用メモリ | 82,272 KB |
| 実行使用メモリ | 169,048 KB |
| 最終ジャッジ日時 | 2024-12-16 00:38:34 |
| 合計ジャッジ時間 | 13,640 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 23 |
ソースコード
n = int(input())
P = []
for _ in range(n):
x, y = map(int, input().split())
x, y = x + y, x - y
P.append([x, y])
mod = 998244353
class Fenwick_Tree:
def __init__(self, n):
self.n = n
self.data = [0] * n
def add(self, p, x):
p += 1
while p <= self.n:
self.data[p - 1] += x
self.data[p - 1] %= mod
p += p & -p
def sum(self, l, r):
'''範囲[l, r)(lからr-1まで)の総和を求める'''
return (self._sum(r) - self._sum(l)) % mod
def _sum(self, r):
'''範囲[0, r)(0からr-1まで)の総和を求める'''
s = 0
while r > 0:
s += self.data[r - 1]
s %= mod
r -= r & -r
return s
if P[0][0] > P[-1][0]:
for i in range(n):
P[i][0] *= -1
if P[0][1] > P[-1][1]:
for i in range(n):
P[i][1] *= -1
from bisect import bisect_left
def compression(lst):
sort_lst = sorted(set(lst))
compression_lst = [None for _ in range(len(lst))]
ele2ind_dict = dict()
for i, ele in enumerate(lst):
compression_lst[i] = bisect_left(sort_lst, ele)
ele2ind_dict[ele] = compression_lst[i]
return sort_lst, compression_lst, ele2ind_dict
Y = [P[i][1] for i in range(n)]
_, _, ele2ind_dict = compression(Y)
Y = [ele2ind_dict[Y[i]] for i in range(n)]
for i in range(n):
P[i][1] = Y[i]
PP = []
for i in range(n):
x, y = P[i]
if P[0][0] <= x <= P[-1][0] and P[0][1] <= y <= P[-1][1]:
PP.append((x, y))
PP.sort(key=lambda x: (x[0], x[1]))
DP = Fenwick_Tree(len(set(Y)))
DP.add(PP[0][1], 1)
for i in range(1, len(PP) - 1):
DP.add(PP[i][1], DP._sum(PP[i][1] + 1))
print(DP._sum(PP[-1][1] + 1))