| Task: | Ruudukko | 
| Sender: | okkokko | 
| Submission time: | 2022-11-01 22:46:07 +0200 | 
| Language: | Python3 (PyPy3) | 
| Status: | READY | 
| Result: | 61 | 
| group | verdict | score | 
|---|---|---|
| #1 | ACCEPTED | 28 | 
| #2 | ACCEPTED | 33 | 
| #3 | TIME LIMIT EXCEEDED | 0 | 
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | ACCEPTED | 0.04 s | 1, 2, 3 | details | 
| #2 | ACCEPTED | 0.04 s | 1, 2, 3 | details | 
| #3 | ACCEPTED | 0.04 s | 1, 2, 3 | details | 
| #4 | ACCEPTED | 0.06 s | 2, 3 | details | 
| #5 | ACCEPTED | 0.76 s | 2, 3 | details | 
| #6 | ACCEPTED | 0.58 s | 2, 3 | details | 
| #7 | ACCEPTED | 0.22 s | 3 | details | 
| #8 | TIME LIMIT EXCEEDED | -- | 3 | details | 
| #9 | TIME LIMIT EXCEEDED | -- | 3 | details | 
Code
def I():
    return map(int, input().split())
n, = I()
grid = [list(I()) for _ in range(n)]
route_grid = [[None] * n for _ in range(n)]
"route_grid[y][x] is how many routes can start from the tile. None if it hasn't been calculated yet"
line_values_row = [[{1: 0}, 1, 1] for _ in range(n)]
line_values_col = [[{1: 0}, 1, 1] for _ in range(n)]
"line_values_col[x] is a list of a dict and two ints, the first int equals the greatest key value in the dict, the second is the highest known number that has the same value as the greatest key"
def get_line_values_row(y: int, v: int):
    """tells how many routes can start from a tile of value v and first go along row y \n
    sum of the route values of tiles less than v on row y"""
    "naive"
    # if v in line_values_row[y][0].keys():
    #     return line_values_row[y][0][v]
    # s = 0
    # for x in range(n):
    #     if grid[y][x] < v:
    #         s += route_grid[y][x]
    # line_values_row[y][0][v] = s
    # return s
    if v == line_values_row[y][2]:
        return line_values_row[y][0][line_values_row[y][1]]
    if (line_values_row[y][2] == v - 1) and (v - 1 not in [grid[y][x] for x in range(n)]):
        line_values_row[y][2] = v
        return line_values_row[y][0][line_values_row[y][1]]
    s = 0
    for x in range(n):
        if grid[y][x] < v:
            s += route_grid[y][x]
    line_values_row[y][0][v] = s
    line_values_row[y][1] = v
    line_values_row[y][2] = v
    return s
def get_line_values_col(x: int, v: int):
    "naive"
    if v == line_values_col[x][2]:
        return line_values_col[x][0][line_values_col[x][1]]
    if (line_values_col[x][2] == v - 1) and (v - 1 not in [grid[y][x] for y in range(n)]):
        line_values_col[x][2] = v
        return line_values_col[x][0][line_values_col[x][1]]
    s = 0
    for y in range(n):
        if grid[y][x] < v:
            s += route_grid[y][x]
    line_values_col[x][0][v] = s
    line_values_col[x][1] = v
    line_values_col[x][2] = v
    return s
def calculate_routes(y: int, x: int):
    number = grid[y][x]
    if number == 1:
        route_grid[y][x] = 1
        return
    else:
        route_grid[y][x] = get_line_values_col(x, number) + get_line_values_row(y, number) + 1
for a in range(1, n * n + 1):
    ready = True
    for y in range(n):
        if None not in route_grid[y]:
            continue
        ready = False
        x = -1
        while True:
            try:
                x = grid[y].index(a, x + 1)
                calculate_routes(y, x)
            except ValueError:
                break
    if ready:
        break
divisor = 10**9 + 7
def summod(x):
    return sum(y % divisor for y in x) % divisor
w = summod(map(summod, route_grid))
print(w)
Test details
Test 1
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 3 1 1 1 1 1 1 1 1 1  | 
| correct output | 
|---|
| 9 | 
| user output | 
|---|
| 9 | 
Test 2
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 3 1 2 3 6 5 4 7 8 9  | 
| correct output | 
|---|
| 135 | 
| user output | 
|---|
| 135 | 
Test 3
Group: 1, 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 3 7 8 1 4 5 4 3 9 6  | 
| correct output | 
|---|
| 57 | 
| user output | 
|---|
| 57 | 
Test 4
Group: 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...  | 
| correct output | 
|---|
| 10000 | 
| user output | 
|---|
| 10000 | 
Test 5
Group: 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 100 1 2 3 4 5 6 7 8 9 10 11 12 13 ...  | 
| correct output | 
|---|
| 187458477 | 
| user output | 
|---|
| 187458477 | 
Test 6
Group: 2, 3
Verdict: ACCEPTED
| input | 
|---|
| 100 2995 8734 1018 2513 7971 5063 ...  | 
| correct output | 
|---|
| 964692694 | 
| user output | 
|---|
| 964692694 | 
Test 7
Group: 3
Verdict: ACCEPTED
| input | 
|---|
| 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...  | 
| correct output | 
|---|
| 1000000 | 
| user output | 
|---|
| 1000000 | 
Test 8
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input | 
|---|
| 1000 1 2 3 4 5 6 7 8 9 10 11 12 13 ...  | 
| correct output | 
|---|
| 229147081 | 
| user output | 
|---|
| (empty) | 
Test 9
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input | 
|---|
| 1000 520283 805991 492643 75254 527...  | 
| correct output | 
|---|
| 951147313 | 
| user output | 
|---|
| (empty) | 
