Submission details
Task:Maalaus
Sender:henri0
Submission time:2025-10-31 18:26:37 +0200
Language:C++ (C++17)
Status:READY
Result:10
Feedback
groupverdictscore
#1ACCEPTED10
#20
#30
#40
Test results
testverdicttimegroup
#1ACCEPTED0.00 s1, 3, 4details
#2ACCEPTED0.00 s3, 4details
#3ACCEPTED0.00 s1, 3, 4details
#4--2, 4details
#5--2, 4details
#60.25 s3, 4details
#70.19 s3, 4details
#8--4details
#9--4details
#10ACCEPTED0.00 s1, 3, 4details
#11ACCEPTED0.00 s1, 3, 4details
#12--2, 4details
#13--2, 4details
#14--4details
#15--4details
#16--4details
#17--4details

Compiler report

input/code.cpp: In member function 'void Painting::Print()':
input/code.cpp:138:27: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
  138 |         for (int y = 0; y < m_height; ++y) {
      |                         ~~^~~~~~~~~~
input/code.cpp:139:31: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
  139 |             for (int x = 0; x < m_width; ++x) {
      |                             ~~^~~~~~~~~
input/code.cpp:142:38: warning: comparison of integer expressions of different signedness: 'const size_t' {aka 'const long unsigned int'} and 'int' [-Wsign-compare]
  142 |                     if (row.position == y && row.removals.count(x) == 0) {
      |                         ~~~~~~~~~~~~~^~~~
input/code.cpp:147:38: warning: comparison of integer expressions of different signedness: 'const size_t' {aka 'const long unsigned i...

Code

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <array>
#include <unordered_set>
#include <cstdint>

template <typename T>
class Grid2D {
public:
    Grid2D(size_t width, size_t height, const T& fill = T()) 
        : m_width(width), m_height(height) 
    { 
        std::cout << "s" << std::endl;
        m_data.resize(width * height, fill);
        std::cout << "e "<< std::endl;
    }
        
    const T& At(size_t x, size_t y) const { return m_data.at(GetIndex(x, y)); }

    T& At(size_t x, size_t y) { return m_data.at(GetIndex(x, y));  }

    size_t GetWidth() const { return m_width; }

    size_t  GetHeight() const { return m_height; }

private:

    size_t GetIndex(size_t x, size_t y) const { return y * m_width + x; }

    std::vector<T> m_data;
    size_t m_width = 0;
    size_t m_height = 0;
};

enum OperationType : uint8_t {
    Row = 0,
    Column
};

struct Operation {
    OperationType type = OperationType::Column;
    size_t position = 0;
    uint8_t color = 0;
};

struct Line {
    size_t position;
    size_t color;
    std::unordered_set<size_t> removals;
};

class Painting {
public:

    Painting(size_t width, size_t height, size_t numcolors)
        : m_width(width), m_height(height), m_numColors(numcolors) {}

    void RunOperations(const std::vector<Operation>& operations) {
        for (auto op : operations) {
            RunOperation(op);
        }
    }

    void RunOperation(Operation op) {
        if (op.type == OperationType::Row) {
            Line row;
            row.position = op.position;
            row.color = op.color;
            bool skip = false;
            for (auto& iRow : m_rows) {
                if (iRow.position == row.position) {
                    iRow.removals.clear();
                    iRow.color = row.color;
                    skip = true;
                    break;
                }
            }
            if (!skip) { 
                m_rows.push_back(row);
            }
            for (auto& col : m_columns) {
                col.removals.insert(row.position);
            }
        } else if (op.type == OperationType::Column) {
            Line col;
            col.position = op.position;
            col.color = op.color;
            bool skip = false;
            for (auto& iCol : m_columns) {
                if (iCol.position == col.position) {
                    iCol.removals.clear();
                    iCol.color = col.color;
                    skip = true;
                    break;
                }
            }
            if (!skip) { 
                m_columns.push_back(col);
            }
            for (auto& row : m_rows) {
                row.removals.insert(col.position);
            }
        }
    }

    std::vector<size_t> CountColors() {

        std::vector<size_t> counts;
        counts.resize(m_numColors, 0);

        for (const auto& row : m_rows) {
            if (row.color == 0) continue;
            counts.at(row.color-1) += m_width - row.removals.size();
        }

        for (const auto& col : m_columns) {
            if (col.color == 0) continue;
            counts.at(col.color-1) += m_height - col.removals.size();
        }
/*
        for (int y = 0; y < m_data.GetHeight(); ++y) {
            for (int x = 0; x < m_data.GetWidth(); ++x) {
                size_t color = m_data.At(x,y);
                if (color == 0) continue;
                if (counts.size() <= color-1) {
                    counts.resize(color, 0);
                }
                counts.at(color-1)++;
            }
        }*/

        return counts;
    }

    void Print() {
        for (int y = 0; y < m_height; ++y) {
            for (int x = 0; x < m_width; ++x) {
                size_t color = 0;
                for (const auto& row : m_rows) {
                    if (row.position == y && row.removals.count(x) == 0) {
                        color = row.color;
                    }
                }
                for (const auto& col : m_columns) {
                    if (col.position == x && col.removals.count(y) == 0) {
                        color = col.color;
                    }
                }
                std::cout << color;
            }
            std::cout << std::endl;
        }
    }

private:

    std::vector<Line> m_rows;
    std::vector<Line> m_columns;

    size_t m_width;
    size_t m_height;

    size_t m_numColors;

};

void ReadParams(
    const std::string& str, 
    size_t* width, 
    size_t* height, 
    size_t* numColors, 
    size_t* numOperations)
{
    std::string token;
    std::stringstream ss(str);

    std::getline(ss, token, ' ');
    *height = std::stoi(token);

    std::getline(ss, token, ' ');
    *width = std::stoi(token);

    std::getline(ss, token, ' ');
    *numColors = std::stoi(token);

    std::getline(ss, token, ' ');
    *numOperations = std::stoi(token);
}

Operation ReadOperation(const std::string& str) {
    std::string token;
    std::stringstream ss(str);

    Operation op;

    std::getline(ss, token, ' ');
    if (token == "R") {
        op.type = OperationType::Row;
    } else if (token == "C") {
        op.type = OperationType::Column;
    } else {
        return Operation{};
    }

    std::getline(ss, token, ' ');
    op.position = std::stoi(token)-1;

    std::getline(ss, token, ' ');
    op.color = std::stoi(token);

    //std::cout << "Op: " << (size_t)op.type << ", " << op.position << ", " << op.color << std::endl;

    return op;
}

int main() {

    

    std::string params;
    std::getline(std::cin, params);

    size_t width, height, numColors, numOperations;

    ReadParams(params, &width, &height, &numColors, &numOperations);

    std::vector<Operation> operations;

    std::string line;
    for (int i = 0; i < numOperations; ++i) {
        std::getline(std::cin, line);
        operations.push_back(ReadOperation(line));
    }

    //std::cout << std::endl;

    //std::cout << width << ", " << height << ", " << numColors << ", " << numOperations << std::endl;


    Painting p(width, height, numColors);

    p.RunOperations(operations);

    //p.Print();

    //p.Print();

    std::vector<size_t> counts = p.CountColors();

    for (auto c : counts) {
        std::cout << c << " ";
    }
    std::cout << std::endl;


    return 0;
}

Test details

Test 1 (public)

Group: 1, 3, 4

Verdict: ACCEPTED

input
3 4 4 4
R 1 1
C 3 4
R 2 2
R 1 1

correct output
4 4 0 1

user output
4 4 0 1 

Test 2 (public)

Group: 3, 4

Verdict: ACCEPTED

input
1000000000 1000000000 5 10
C 70724881 4
C 290904744 1
C 569311326 5
R 896293092 1
...

correct output
3999999991 1999999998 19999999...

user output
3999999991 1999999998 19999999...

Test 3

Group: 1, 3, 4

Verdict: ACCEPTED

input
10 10 10 10
R 10 8
C 1 2
R 10 2
R 1 4
...

correct output
0 13 0 8 7 20 0 0 10 7

user output
0 13 0 8 7 20 0 0 10 7 

Test 4

Group: 2, 4

Verdict:

input
1000000000 1000000000 1 200000
R 185082082 1
C 549662476 1
R 484749097 1
R 330334821 1
...

correct output
199984000629575

user output
(empty)

Test 5

Group: 2, 4

Verdict:

input
1000000000 1000000000 1 200000
C 354072394 1
C 221236382 1
C 63527838 1
C 538599654 1
...

correct output
126261014543986

user output
(empty)

Test 6

Group: 3, 4

Verdict:

input
1000000000 1000000000 2000 200...

correct output
999999400 2999997760 999999118...

user output
4999997831 10999993480 1099999...

Feedback: Incorrect character on line 1 col 1: expected "999999400", got "4999997831"

Test 7

Group: 3, 4

Verdict:

input
1000000000 1000000000 2000 200...

correct output
999999481 0 999999445 0 0 0 0 ...

user output
2999998883 6999996905 49999980...

Feedback: Incorrect character on line 1 col 1: expected "999999481", got "2999998883"

Test 8

Group: 4

Verdict:

input
1000000000 1000000000 200000 2...

correct output
0 0 999997829 0 1999872519 199...

user output
(empty)

Test 9

Group: 4

Verdict:

input
1000000000 1000000000 200000 2...

correct output
999986843 0 0 999966411 999971...

user output
(empty)

Test 10

Group: 1, 3, 4

Verdict: ACCEPTED

input
1 10 10 10
C 1 10
R 1 4
C 9 3
R 1 7
...

correct output
1 0 0 0 0 0 0 9 0 0

user output
1 0 0 0 0 0 0 9 0 0 

Test 11

Group: 1, 3, 4

Verdict: ACCEPTED

input
10 1 10 10
R 4 6
R 5 1
R 4 2
R 3 9
...

correct output
0 0 0 0 0 0 0 10 0 0

user output
0 0 0 0 0 0 0 10 0 0 

Test 12

Group: 2, 4

Verdict:

input
1 1000000000 1 200000
C 298761159 1
R 1 1
C 831911362 1
C 25171734 1
...

correct output
1000000000

user output
(empty)

Test 13

Group: 2, 4

Verdict:

input
1000000000 1 1 200000
R 68306849 1
C 1 1
C 1 1
R 485427101 1
...

correct output
1000000000

user output
(empty)

Test 14

Group: 4

Verdict:

input
1000000000 1000000000 100 2000...

correct output
2003899199298 2016897879262 20...

user output
(empty)

Test 15

Group: 4

Verdict:

input
1000000000 1000000000 100 2000...

correct output
1267960483393 1326958437362 12...

user output
(empty)

Test 16

Group: 4

Verdict:

input
1000000000 1000000000 10000 20...

correct output
26998778013 13999380552 239989...

user output
(empty)

Test 17

Group: 4

Verdict:

input
1000000000 1000000000 10000 20...

correct output
7999699356 8999760379 12999665...

user output
(empty)