Submission #6364672


Source Code Expand

import sys
input = sys.stdin.readline
from collections import defaultdict
import bisect

INF = 10 ** 12

N,a,b = map(int,input().split())
X_to_Y = defaultdict(lambda: [-INF,INF])
Y_to_X = defaultdict(lambda: [-INF,INF])
for i in range(1,N+1):
    x,y = map(int,input().split())
    x,y = x+y,x-y
    X_to_Y[x].append(y)
    Y_to_X[y].append(x)
    if i == a:
        sx,sy = x,y
    elif i == b:
        tx,ty = x,y

R = max(abs(sx-tx), abs(sy-ty))

for key, arr in X_to_Y.items():
    arr.sort()
    L = len(arr)
    move_right = list(range(1,L)) + [None]
    X_to_Y[key] = [arr,move_right]
    
for key, arr in Y_to_X.items():
    arr.sort()
    L = len(arr)
    move_right = list(range(1,L)) + [None]
    Y_to_X[key] = [arr,move_right]

equiv_class = set([(sx,sy), (tx,ty)])

answer = 0
task = [(sx,sy), (tx,ty)]

while task:
    x,y = task.pop()
    # 既出の元も含めて辺の個数を数える
    # 未出の元を同値に追加
    # x,y両方満たすものは、x側にだけ入れる
    for x1 in [x-R,x+R]:
        if not (x1 in X_to_Y):
            continue
        arr, move_right = X_to_Y[x1]
        left = bisect.bisect_left(arr, y-R)
        right = bisect.bisect_right(arr, y+R)
        # [left, right) が辺で結べるターゲット
        answer += right - left # 辺の個数
        i = left
        while i < right:
            y1 = arr[i]
            if (x1,y1) not in equiv_class:
                equiv_class.add((x1,y1))
                task.append((x1,y1))
            # なるべく、既に居ない元は見ないで済ませるように
            next_i = move_right[i]
            if next_i >= right:
                break
            move_right[i] = right
            i = next_i
    for y1 in [y-R,y+R]:
        if not y1 in Y_to_X:
            continue
        arr, move_right = Y_to_X[y1]
        left = bisect.bisect_left(arr, x-R+1)
        right = bisect.bisect_right(arr, x+R-1)
        # [left, right) が辺で結べるターゲット
        answer += right - left # 辺の個数
        i = left
        while i < right:
            x1 = arr[i]
            if (x1,y1) not in equiv_class:
                equiv_class.add((x1,y1))
                task.append((x1,y1))
            # なるべく、既に居ない元は見ないで済ませるように
            next_i = move_right[i]
            if next_i >= right:
                break
            move_right[i] = right
            i = next_i

answer //= 2 # 両方向から辺を見た
print(answer)

Submission Info

Submission Time
Task E - Manhattan Compass
User maspy
Language Python (3.4.3)
Score 900
Code Size 2596 Byte
Status AC
Exec Time 1885 ms
Memory 91568 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 900 / 900
Status
AC × 3
AC × 28
Set Name Test Cases
Sample subtask0_0.txt, subtask0_1.txt, subtask0_2.txt
All subtask0_0.txt, subtask0_1.txt, subtask0_2.txt, subtask1_0.txt, subtask1_1.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask1_19.txt, subtask1_2.txt, subtask1_20.txt, subtask1_21.txt, subtask1_22.txt, subtask1_23.txt, subtask1_24.txt, subtask1_3.txt, subtask1_4.txt, subtask1_5.txt, subtask1_6.txt, subtask1_7.txt, subtask1_8.txt, subtask1_9.txt
Case Name Status Exec Time Memory
subtask0_0.txt AC 23 ms 3444 KiB
subtask0_1.txt AC 21 ms 3316 KiB
subtask0_2.txt AC 21 ms 3316 KiB
subtask1_0.txt AC 1215 ms 71116 KiB
subtask1_1.txt AC 1226 ms 71200 KiB
subtask1_10.txt AC 1557 ms 68512 KiB
subtask1_11.txt AC 236 ms 12484 KiB
subtask1_12.txt AC 764 ms 54816 KiB
subtask1_13.txt AC 763 ms 54944 KiB
subtask1_14.txt AC 1829 ms 89536 KiB
subtask1_15.txt AC 231 ms 12500 KiB
subtask1_16.txt AC 1226 ms 71044 KiB
subtask1_17.txt AC 1278 ms 70932 KiB
subtask1_18.txt AC 1316 ms 30560 KiB
subtask1_19.txt AC 235 ms 12500 KiB
subtask1_2.txt AC 1885 ms 91568 KiB
subtask1_20.txt AC 1223 ms 70304 KiB
subtask1_21.txt AC 1276 ms 70560 KiB
subtask1_22.txt AC 1321 ms 30620 KiB
subtask1_23.txt AC 1161 ms 29432 KiB
subtask1_24.txt AC 1233 ms 70944 KiB
subtask1_3.txt AC 621 ms 18860 KiB
subtask1_4.txt AC 1226 ms 69152 KiB
subtask1_5.txt AC 1213 ms 69792 KiB
subtask1_6.txt AC 1306 ms 31296 KiB
subtask1_7.txt AC 682 ms 20136 KiB
subtask1_8.txt AC 775 ms 54176 KiB
subtask1_9.txt AC 1239 ms 70300 KiB