Submission details
Task:Hypyt
Sender:rene
Submission time:2025-11-05 22:15:14 +0200
Language:Python3 (PyPy3)
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED10
#2ACCEPTED20
#3ACCEPTED15
#4ACCEPTED15
#5ACCEPTED40
Test results
testverdicttimegroup
#1ACCEPTED0.05 s1, 2, 3, 4, 5details
#2ACCEPTED0.05 s1, 2, 3, 4, 5details
#3ACCEPTED0.06 s1, 2, 3, 4, 5details
#4ACCEPTED0.05 s1, 2, 3, 4, 5details
#5ACCEPTED0.05 s1, 2, 3, 4, 5details
#6ACCEPTED0.20 s2, 5details
#7ACCEPTED0.16 s2, 5details
#8ACCEPTED0.13 s2, 5details
#9ACCEPTED0.26 s3, 4, 5details
#10ACCEPTED0.26 s3, 4, 5details
#11ACCEPTED0.26 s3, 4, 5details
#12ACCEPTED0.27 s4, 5details
#13ACCEPTED0.27 s4, 5details
#14ACCEPTED0.28 s4, 5details
#15ACCEPTED0.49 s5details
#16ACCEPTED0.41 s5details
#17ACCEPTED0.38 s5details
#18ACCEPTED0.34 s5details
#19ACCEPTED0.33 s5details
#20ACCEPTED0.33 s5details
#21ACCEPTED0.25 s5details
#22ACCEPTED0.05 s1, 2, 3, 4, 5details
#23ACCEPTED0.05 s1, 2, 3, 4, 5details
#24ACCEPTED0.24 s5details
#25ACCEPTED0.23 s5details
#26ACCEPTED0.44 s5details
#27ACCEPTED0.21 s5details

Code

import sys
from collections import deque

def readints():
  return list(map(int, sys.stdin.readline().split()))

def distance_calc(n, m, row_to_cols, col_to_rows, spawns, targets):
  targets_set = set(targets)
  for s in spawns:
    if s in targets_set:
      return 0

  N = n + m
  dist1 = [-1] * N
  dist2 = [-1] * N
  q1 = deque()
  q2 = deque()

  for s in spawns:
    dist1[s] = 0
    q1.append(s)
  for t in targets:
    dist2[t] = 0
    q2.append(t)

  INF = 10**18
  best = INF

  while q1 and q2:
    if len(q1) <= len(q2):
      u = q1.popleft()
      du = dist1[u]
      if du >= best: 
        continue

      if u < n:
        for cx in row_to_cols[u]:
          v = n + cx
          if dist1[v] == -1:
            dist1[v] = du + 1
            q1.append(v)
            if dist2[v] != -1:
              total = dist1[v] + dist2[v]
              if total < best:
                best = total
      else:
        col_index = u - n
        for ry in col_to_rows[col_index]:
          v = ry
          if dist1[v] == -1:
            dist1[v] = du + 1
            q1.append(v)
            if dist2[v] != -1:
              total = dist1[v] + dist2[v]
              if total < best:
                best = total
    else:
      u = q2.popleft()
      du = dist2[u]
      if du >= best:
        continue

      if u < n:
        for cx in row_to_cols[u]:
          v = n + cx
          if dist2[v] == -1:
            dist2[v] = du + 1
            q2.append(v)
            if dist1[v] != -1:
              total = dist1[v] + dist2[v]
              if total < best:
                best = total
      else:
        col_index = u - n
        for ry in col_to_rows[col_index]:
          v = ry
          if dist2[v] == -1:
            dist2[v] = du + 1
            q2.append(v)
            if dist1[v] != -1:
              total = dist1[v] + dist2[v]
              if total < best:
                best = total

  return best if best != INF else -1

def main():
  data = sys.stdin.read().strip().splitlines()

  it = iter(data)
  n, m, q = map(int, next(it).split())
  grid = [list(next(it).rstrip()) for _ in range(n)]

  row_to_cols = [[] for _ in range(n)]
  col_to_rows = [[] for _ in range(m)]
  for y in range(n):
    row = grid[y]
    for x, ch in enumerate(row):
      if ch == '.':
        row_to_cols[y].append(x)
        col_to_rows[x].append(y)

  N = n + m
  neighbors = [[] for _ in range(N)]
  for y in range(n):
    for x in row_to_cols[y]:
      ry = y
      cx = n + x
      neighbors[ry].append(cx)
      neighbors[cx].append(ry)

  dist = [[-1] * N for _ in range(N)]
  dq = deque()
  for s in range(N):
    if not neighbors[s]:
      dist[s][s] = 0
      continue
    drow = dist[s]
    drow[s] = 0
    dq.clear()
    dq.append(s)
    while dq:
      u = dq.popleft()
      nu = drow[u] + 1
      for v in neighbors[u]:
        if drow[v] == -1:
          drow[v] = nu
          dq.append(v)

  output = []
  for _ in range(q):
    y1, x1, y2, x2 = map(int, next(it).split())
    y1 -= 1; x1 -= 1; y2 -= 1; x2 -= 1

    if grid[y1][x1] != '.' or grid[y2][x2] != '.':
      output.append("-1")
      continue

    if y1 == y2 and x1 == x2:
      output.append("0")
      continue

    Ry1 = y1
    Cx1 = n + x1
    Ry2 = y2
    Cx2 = n + x2

    dmin = 10**9
    d = dist[Ry1][Ry2]
    if d != -1 and d < dmin: dmin = d
    d = dist[Ry1][Cx2]
    if d != -1 and d < dmin: dmin = d
    d = dist[Cx1][Ry2]
    if d != -1 and d < dmin: dmin = d
    d = dist[Cx1][Cx2]
    if d != -1 and d < dmin: dmin = d

    if dmin == 10**9:
      output.append("-1")
    else:
      output.append(str(1 + dmin))

  print("\n".join(output))

main()

Test details

Test 1 (public)

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
4 6 5
.*.***
*...**
*****.
*..*.*
...

correct output
1
0
3
3
-1

user output
1
0
3
3
-1

Test 2

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
10 10 10
..........
.....*....
........*.
*.*....*..
...

correct output
1
2
1
2
2
...

user output
1
2
1
2
2
...

Test 3

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
10 10 10
*...***.**
*****.*...
**..**.**.
..**.**.*.
...

correct output
1
2
2
1
2
...

user output
1
2
2
1
2
...

Test 4

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
10 10 10
***.*.****
**********
*.********
.*.***.**.
...

correct output
3
4
2
3
4
...

user output
3
4
2
3
4
...

Test 5

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
10 10 1
.****.****
**.**..***
**********
*******..*
...

correct output
7

user output
7

Test 6

Group: 2, 5

Verdict: ACCEPTED

input
250 250 250
.*...*.....*******..**...*.......

correct output
2
3
3
2
2
...

user output
2
3
3
2
2
...

Test 7

Group: 2, 5

Verdict: ACCEPTED

input
250 250 250
...*......**.**.*.*..**..*..**...

correct output
2
2
2
2
3
...

user output
2
2
2
2
3
...

Test 8

Group: 2, 5

Verdict: ACCEPTED

input
250 250 250
**..**..****.****.*.***.***..*...

correct output
2
3
3
3
3
...

user output
2
3
3
3
3
...

Test 9

Group: 3, 4, 5

Verdict: ACCEPTED

input
40 40 200000
...*.**.*..*.............*.*.....

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 10

Group: 3, 4, 5

Verdict: ACCEPTED

input
40 40 200000
**.**..*.*.*.******....****.*....

correct output
2
1
3
2
2
...

user output
2
1
3
2
2
...

Test 11

Group: 3, 4, 5

Verdict: ACCEPTED

input
40 40 200000
.*.*.**.*****.***.*.****.**.**...

correct output
3
3
3
3
3
...

user output
3
3
3
3
3
...

Test 12

Group: 4, 5

Verdict: ACCEPTED

input
80 80 200000
*....**.***..****...*.....*......

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 13

Group: 4, 5

Verdict: ACCEPTED

input
80 80 200000
.***.*..*.***..*****....**...*...

correct output
3
2
2
3
2
...

user output
3
2
2
3
2
...

Test 14

Group: 4, 5

Verdict: ACCEPTED

input
80 80 200000
*******.*****.*..*..****...***...

correct output
2
3
1
2
2
...

user output
2
3
1
2
2
...

Test 15

Group: 5

Verdict: ACCEPTED

input
250 250 200000
*....*..*..*..**..*.........**...

correct output
3
2
2
2
2
...

user output
3
2
2
2
2
...

Test 16

Group: 5

Verdict: ACCEPTED

input
250 250 200000
..*....*..*......*.**.*.*..***...

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 17

Group: 5

Verdict: ACCEPTED

input
250 250 200000
*..*.*****.*********.****.****...

correct output
3
3
2
2
2
...

user output
3
3
2
2
2
...

Test 18

Group: 5

Verdict: ACCEPTED

input
250 250 200000
*********.**********.******.**...

correct output
3
3
3
3
3
...

user output
3
3
3
3
3
...

Test 19

Group: 5

Verdict: ACCEPTED

input
250 250 200000
.*****************************...

correct output
104
422
145
93
65
...

user output
104
422
145
93
65
...

Test 20

Group: 5

Verdict: ACCEPTED

input
250 250 200000
..****************************...

correct output
57
155
38
65
98
...

user output
57
155
38
65
98
...

Test 21

Group: 5

Verdict: ACCEPTED

input
250 250 200000
.*****************************...

correct output
498
498
498
498
498
...

user output
498
498
498
498
498
...

Test 22

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
10 1 10
*
*
.
*
...

correct output
0
1
1
0
0
...

user output
0
1
1
0
0
...

Test 23

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
1 10 10
........*.
1 7 1 10
1 4 1 7
1 5 1 1
...

correct output
1
1
1
1
1
...

user output
1
1
1
1
1
...

Test 24

Group: 5

Verdict: ACCEPTED

input
250 1 200000
*
.
*
.
...

correct output
1
1
1
1
1
...

user output
1
1
1
1
1
...

Test 25

Group: 5

Verdict: ACCEPTED

input
1 250 200000
*.*.*...*.*.**.***..**.*.*..**...

correct output
1
1
1
1
1
...

user output
1
1
1
1
1
...

Test 26

Group: 5

Verdict: ACCEPTED

input
250 250 200000
.................................

correct output
2
2
2
2
2
...

user output
2
2
2
2
2
...

Test 27

Group: 5

Verdict: ACCEPTED

input
250 250 200000
******************************...

correct output
0
0
0
0
0
...

user output
0
0
0
0
0
...