Задача: На экране рисуются полосы

Экран представляет собой прямоугольник а пикселей в высоту и в пикселей в ширину. Каждый шаг на экране рисуются полосы пикселей цветом с(либо вертикально либо горизонтально).Если пиксель уже имеет какой-то цвет, то он перекрашивается. Изначально экран заполнен цветом 0, этим цветом рисоваться не планируется. Таких операций будет произведено N штук. Формат входных данных: В первой строке даны размеры экрана А и В(1<=A<=B<=10^9), число используемых цветом N(1<=N<=3x10^5) и количество полос q(1<=q<=3x10^5) В следующих q строках даны полосы в порядке их появления. Каждая полоса задается тройкой чисел: type n color, где type = 1 означает закрашивание строки, а type =2 – столбца. N означает порядковый номер строки или столбца, а color – используемый цвет. Формат выходных данных: Для каждого цвета от 1 до N вывески количество пикселей данного цвета.

Пример 1:
Ввод:
4 6 5 7
1 1 1
2 2 4
1 3 3
2 4 2
1 1 2
1 1 5
2 1 3
Вывод:
0 3 8 2 5

Пример 2: Ввод: 500000000 500000000 3 5
1 1 2
1 2 3
1 3 3
1 4 3
1 5 3
Вывод: 0 500000000 200000000

Вот рабочий алгоритм, но он съедает очень много памяти из-за создания массива размером a*b. Что при числах от 10**5 уже не проходит тесты. Как можно улучшить, чтобы обойти это?

b, a, N, q = map(int, input().split())

matrix=[0]*b*a
for i in range(q):
    typ,n,color =map(int, input().split())
    if typ == 1:
        for k in range(a):
            matrix[(n-1)*a+k] = color

    if typ == 2:
        for k in range(b):
            matrix[(n-1)+k*b] = color
matrix= [i for i in matrix if i != 0]
numbers=[]
for i in range(1,N+1):
   numbers.append(matrix.count(i))
print(' '.join(map(str, numbers)))

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Если одна и та же строка закрашена много раз, учитывать надо только последнюю закраску. Далее будем считать что строки и столбцы не повторяются.

Сколько пикселов закрасит очередная строка? Ширина экрана минус число закрашенных столбцов после неё.

Будет обрабатывать штрихи в обратном порядке.

ab[0] - ширина экрана, ab[1] - высота экрана.

painted[0] - множество закрашенных столбцов, painted[1] - множество закрашенных строк.

colors[c - 1] - число пикселей цвета c.

*ab, n, q = map(int, input().split())

s = tuple(tuple(map(int, input().split())) for _ in range(q))

painted = set(), set()
colors = [0] * n
for t, x, c in reversed(s):
    if x not in painted[1 - (t - 1)]:
        painted[1 - (t - 1)].add(x)
        colors[c - 1] += ab[1 - (t - 1)] - len(painted[t - 1])

print(*colors)
$ python paint.py << EOF
4 6 5 7
1 1 1
2 2 4
1 3 3
2 4 2
1 1 2
1 1 5
2 1 3
EOF
0 3 8 2 5

$ python paint.py << EOF
500000000 500000000 3 5
1 1 2
1 2 3
1 3 3
1 4 3
1 5 3
EOF
0 500000000 2000000000
→ Ссылка