Submission details
Task:Maalaus
Sender:NicholasAhman
Submission time:2025-11-05 18:53:43 +0200
Language:C++ (C++17)
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
#30
#40
Test results
testverdicttimegroup
#10.00 s1, 3, 4details
#20.00 s3, 4details
#30.00 s1, 3, 4details
#4--2, 4details
#5--2, 4details
#60.17 s3, 4details
#70.24 s3, 4details
#8--4details
#9--4details
#100.00 s1, 3, 4details
#110.00 s1, 3, 4details
#12--2, 4details
#13--2, 4details
#14--4details
#15--4details
#16--4details
#17--4details

Code

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>
#include <unordered_map>
#include <unordered_set>
 
uint64_t *colors;
 
size_t width;
size_t height;
size_t color_count;
 
size_t get_uuid(int32_t rc, size_t n) {
    return ((size_t)rc << 32) | n;
}
 
struct DrawData {
    int32_t color;
    size_t covered;
};
 
std::unordered_map<size_t, DrawData> row_ops;
std::unordered_map<size_t, DrawData> col_ops;
 
std::unordered_map<size_t, std::unordered_set<size_t>> ops_covered;
 
void insert_op(int rc, size_t n, int color) {
    if (rc == 'R') {
        row_ops[get_uuid(rc, n)] = {color, width};
    } else {
        col_ops[get_uuid(rc, n)] = {color, height};
    }
}
 
void draw_line(int rc, size_t n, int color) {
    if (row_ops.size() == 0 and col_ops.size() == 0) {
        insert_op(rc, n, color);
        return;
    }
    
    if (rc == 'R') {
        const auto same_line = row_ops.find(get_uuid(rc, n));
        if (same_line != row_ops.end()) {
            same_line->second.covered = 0;
        }
 
        for (auto &r : col_ops) {
            const auto same_line_covered = same_line != row_ops.end() ? ops_covered.find(same_line->first) : ops_covered.end();
            // For when we re-draw a line that has been covered by a new orthogonal line
            const auto opp_line_covered = same_line != row_ops.end() ? ops_covered.find(r.first) : ops_covered.end();
            if (opp_line_covered != ops_covered.end() and opp_line_covered->second.find(get_uuid(rc, n)) != opp_line_covered->second.end()) {
                opp_line_covered->second.erase(opp_line_covered->second.find(get_uuid(rc, n)));
            }
 
 
            if (same_line_covered != ops_covered.end()) {
                if (same_line_covered->second.find(r.first) == same_line_covered->second.end()) {
                    r.second.covered--;
                } else {
                    same_line_covered->second.erase(same_line_covered->second.find(r.first));
                }
            } else {
                r.second.covered--;
            }

            ops_covered[get_uuid(rc, n)].insert(r.first);
        }
 
    } else {
        const auto same_line = col_ops.find(get_uuid(rc, n));
        if (same_line != col_ops.end()) {
            same_line->second.covered = 0;
        }
 
        for (auto &r : row_ops) {
            const auto same_line_covered = same_line != col_ops.end() ? ops_covered.find(same_line->first) : ops_covered.end();
            // For when we re-draw a line that has been covered by a new orthogonal line
            const auto opp_line_covered = same_line != col_ops.end() ? ops_covered.find(r.first) : ops_covered.end();
            if (opp_line_covered != ops_covered.end() and opp_line_covered->second.find(get_uuid(rc, n)) != opp_line_covered->second.end()) {
                opp_line_covered->second.erase(opp_line_covered->second.find(get_uuid(rc, n)));
            }
 
 
            if (same_line_covered != ops_covered.end()) {
                if (same_line_covered->second.find(r.first) == same_line_covered->second.end()) {
                    r.second.covered--;
                } else {
                    same_line_covered->second.erase(same_line_covered->second.find(r.first));
                }
            } else {
                r.second.covered--;
            }

            ops_covered[get_uuid(rc, n)].insert(r.first);
        }
 
    }
 
    insert_op(rc, n, color);
}
 
 
int main(void) {
    char *input = (char *)malloc(1024*1024*8);
    const size_t len = read(0, input, 1024*1024*8);
    size_t idx = 0;
 
    size_t next_space = strchr(input, ' ') - input;
    input[next_space] = '\0';
    height = atoi(input);
    idx += next_space + 1;
 
    next_space = strchr((input + idx), ' ') - (input + idx);
    (input + idx)[next_space] = '\0';
    width = atoi((input + idx));
    idx += next_space + 1;
 
    next_space = strchr((input + idx), ' ') - (input + idx);
    (input + idx)[next_space] = '\0';
    color_count = atoi((input + idx));
    idx += next_space + 1;
 
    next_space = strchr((input + idx), '\n') - (input + idx);
    (input + idx)[next_space] = '\0';
    size_t operations = atoi((input + idx));
    idx += next_space + 1;
 
    colors = (uint64_t *)malloc((color_count + 1) * sizeof(uint64_t));
    row_ops.reserve(operations);
    col_ops.reserve(operations);
    ops_covered.reserve(operations);
 
    for (size_t i = 0; i < color_count + 1; i++) {
        colors[i] = 0;
    }
 
    for (size_t i = 0; i < operations; i++) {
        int rc = (input + idx)[0];
        idx += 2;
 
        next_space = strchr((input + idx), ' ') - (input + idx);
        (input + idx)[next_space] = '\0';
        size_t n = atoi((input + idx));
        idx += next_space + 1;
 
        if (i == operations - 1) {
            next_space = len - ((input + idx) - input) - 1;
        } else {
            next_space = strchr((input + idx), '\n') - (input + idx);
        }
 
        (input + idx)[next_space] = '\0';
        size_t color = atoi((input + idx));
        idx += next_space + 1;
 
        draw_line(rc, n, color);
    }
 
    for (auto &r : row_ops) {
        colors[r.second.color] += r.second.covered;
        printf("%lu\n", r.second.covered);
    }
 
    for (auto &r : col_ops) {
        colors[r.second.color] += r.second.covered;
    }
 
    for (size_t i = 1; i < color_count + 1; i++) {
        printf("%lu ", colors[i]);
    }
 
    free(input);
    free(colors);
 
}

Test details

Test 1 (public)

Group: 1, 3, 4

Verdict:

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
4 4 0 1 

Feedback: Output is longer than expected

Test 2 (public)

Group: 3, 4

Verdict:

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

correct output
3999999991 1999999998 19999999...

user output
1000000000
999999999
999999999
999999999
999999999
...

Feedback: Output is longer than expected

Test 3

Group: 1, 3, 4

Verdict:

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
10
10
8
10
8
...

Feedback: Output is longer than expected

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
1000000000
999999998
999999995
999999994
999999993
...

Feedback: Output is longer than expected

Test 7

Group: 3, 4

Verdict:

input
1000000000 1000000000 2000 200...

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

user output
999999997
999999994
999999991
999999990
999999990
...

Feedback: Output is longer than expected

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:

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
8
1 0 0 0 0 0 0 9 0 0 

Feedback: Output is longer than expected

Test 11

Group: 1, 3, 4

Verdict:

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
...

Feedback: Output is longer than expected

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)