CSES - Datatähti 2023 alku - Results
Submission details
Task:Ruudukko
Sender:okkokko
Submission time:2022-11-01 22:46:07 +0200
Language:Python3 (PyPy3)
Status:READY
Result:61
Feedback
groupverdictscore
#1ACCEPTED28
#2ACCEPTED33
#30
Test results
testverdicttimegroup
#1ACCEPTED0.04 s1, 2, 3details
#2ACCEPTED0.04 s1, 2, 3details
#3ACCEPTED0.04 s1, 2, 3details
#4ACCEPTED0.06 s2, 3details
#5ACCEPTED0.76 s2, 3details
#6ACCEPTED0.58 s2, 3details
#7ACCEPTED0.22 s3details
#8--3details
#9--3details

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:

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:

input
1000
520283 805991 492643 75254 527...

correct output
951147313

user output
(empty)