답안 #919598

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
919598 2024-02-01T08:23:39 Z StefanL2005 Paint By Numbers (IOI16_paint) C++14
59 / 100
1 ms 600 KB
#include <bits/stdc++.h>
using namespace std;
ifstream in("file.in");


int get_between(int i, int j, vector<int> &Pre_Sum)
{
    if (i > j)
        swap(i, j);
    if (i == 0)
        return Pre_Sum[j];
    return Pre_Sum[j] - Pre_Sum[i - 1];
}

bool check_block_borders(int i, int j, string &s)
{
    int l = s.length();

    if (i <= 0 || s[i - 1] != 'X')
        if (j >= l - 1 || s[j + 1] != 'X')
            return true;
    return false;
}

int check_block_P (int i, int j, int add, vector<vector<int>> &P, string &s, vector<int> &Pre_Sum)
{
    if (j - add + 1 < 0)
        return 0;
    if (get_between(j - add + 1, j, Pre_Sum) > 0)
        return 0;
    if (!check_block_borders(j - add + 1, j, s))
        return 0;
    if (j - add > 0 && P[i - 1][j - add - 1] == 0)
        return 0;
    if (j - add <= 0 && i != 1)
        return 0;
    return 1;
}

int check_block_S (int i, int j, int add, vector<vector<int>> &S, string &s, vector<int> &Pre_Sum)
{
    int l = s.length();
    if (j + add - 1 >= l)
        return 0;
    if (get_between(j, j + add - 1, Pre_Sum) > 0)
        return 0;
    if (!check_block_borders(j, j + add - 1, s))
        return 0;
    if (j + add < l - 1 && S[i - 1][j + add + 1] == 0)
        return 0;
    if (j + add >= l - 1 && i != 1)
        return 0;
    return 1;
}

void first_line_init(int i, int j, string &s, vector<vector<int>> &M)
{
    while (i != j)
    {
        M[0][i] = 1;
        if (s[i] == 'X')
            { M[0][i] = 0; break; }

        if (i < j) i++;
        else i--;
    }
}

bool can_end_1 (int i, int j, vector<vector<int>> &P, vector<vector<int>> &S)
{
    int k = P.size() - 1, l = P[0].size();

    bool p1 = (i == 0 && j == 0) || (i > 0 && P[j][i - 1]);
    bool p2 = (i == l - 1 && j == k) || (i < l - 1 && S[k - j][i + 1]);
    return p1 && p2;
}

bool can_end_2 (int i, int j, int add, vector<vector<int>> &P, vector<vector<int>> &S)
{
    int k = P.size() - 1, l = P[0].size();

    bool p1 = ((j == 0 && i == 1) || (j > 0 && P[i - 1][j - 1]));
    bool p2 = ((j + add == l && k == i) || (j + add < l && S[k - i][j + add]));
    return (p1 && p2);
}

void fill_ans (string &ans, int j, int add)
{
    for (int i = j; i < j + add; i++)
        if (ans[i] == '_')
            ans[i] = '?';
}

string solve_puzzle (string s, vector<int> c)
{
    int k = c.size(), l = s.length();
    bool change_back = false;
    string ans;
    vector<int> Pre_Sum;
    vector<vector<int>> P, S;

    Pre_Sum = vector<int> (l, 0);
    P = S = vector<vector<int>> (k + 1, vector<int> (l, 0));
    ans.assign(l, '_');

    for (int i = 0; i < l; i++)
    {
        if (s[i] == 'X')
            ans[i] = 'X';
        if (s[i] == '_')
            Pre_Sum[i]++;
        if (i > 0)
            Pre_Sum[i]+= Pre_Sum[i - 1];
    }

    first_line_init(0, l, s, P);
    for (int i = 1; i <= k; i++)
        for (int j = 0; j < l; j++)
        {
            bool _Case = 0, XCase;
            if (j > 0)
                _Case = P[i][j - 1];
            XCase = check_block_P(i, j, c[i - 1], P, s, Pre_Sum);

            switch(s[j])
            {
                case '_':{ P[i][j] = _Case; break; }
                case 'X':{ P[i][j] = XCase; break; }
                case '.':{ P[i][j] = _Case || XCase; break; }
            }
        }

    first_line_init(l - 1, -1, s, S);
    for (int i = 1; i <= k; i++)
        for (int j = l - 1; j >= 0; j--)
        {
            bool _Case = 0, XCase;
            if (j + 1 < l)
                _Case = S[i][j + 1];
            XCase = check_block_S(i, j, c[k - i], S, s, Pre_Sum);

            switch(s[j])
            {
                case '_':{ S[i][j] = _Case; break; }
                case 'X':{ S[i][j] = XCase; break; }
                case '.':{ S[i][j] = _Case || XCase; break; }
            }
        }

    for (int i = 0; i < l; i++)
    {
        bool ok = true;

        for (int j = 0; j <= k && ok; j++)
            if (can_end_1(i, j, P, S))
                ok = false;

        if (ok)
            ans[i] = 'X';
    }

    for (int i = 1; i <= k; i++)
    {
        int add = c[i - 1];
        for (int j = 0; j <= l - add; j++)
        {
            if (get_between(j, j + add - 1, Pre_Sum) > 0)
                continue;
            if (!check_block_borders(j, j + add - 1, ans))
                continue;
            if (!can_end_2(i, j, add, P, S))
                continue;
            fill_ans(ans, j, add);
        }
    }
    return ans;
}

Compilation message

paint.cpp: In function 'std::string solve_puzzle(std::string, std::vector<int>)':
paint.cpp:97:10: warning: unused variable 'change_back' [-Wunused-variable]
   97 |     bool change_back = false;
      |          ^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB n = 13, m = 1
2 Correct 0 ms 348 KB n = 18, m = 1
3 Correct 0 ms 344 KB n = 17, m = 1
4 Correct 0 ms 344 KB n = 1, m = 1
5 Correct 1 ms 344 KB n = 20, m = 1
6 Correct 1 ms 344 KB n = 20, m = 1
7 Correct 0 ms 344 KB n = 20, m = 1
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB n = 13, m = 1
2 Correct 0 ms 348 KB n = 18, m = 1
3 Correct 0 ms 344 KB n = 17, m = 1
4 Correct 0 ms 344 KB n = 1, m = 1
5 Correct 1 ms 344 KB n = 20, m = 1
6 Correct 1 ms 344 KB n = 20, m = 1
7 Correct 0 ms 344 KB n = 20, m = 1
8 Correct 0 ms 344 KB n = 20, m = 5
9 Correct 1 ms 344 KB n = 18, m = 3
10 Correct 0 ms 348 KB n = 17, m = 2
11 Correct 0 ms 344 KB n = 20, m = 2
12 Correct 1 ms 344 KB n = 17, m = 4
13 Correct 1 ms 600 KB n = 17, m = 6
14 Correct 1 ms 344 KB n = 17, m = 1
15 Correct 0 ms 344 KB n = 17, m = 4
16 Correct 1 ms 500 KB n = 13, m = 3
17 Correct 1 ms 344 KB n = 18, m = 4
18 Correct 1 ms 344 KB n = 20, m = 10
19 Correct 0 ms 348 KB n = 19, m = 10
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB n = 13, m = 1
2 Correct 0 ms 348 KB n = 18, m = 1
3 Correct 0 ms 344 KB n = 17, m = 1
4 Correct 0 ms 344 KB n = 1, m = 1
5 Correct 1 ms 344 KB n = 20, m = 1
6 Correct 1 ms 344 KB n = 20, m = 1
7 Correct 0 ms 344 KB n = 20, m = 1
8 Correct 0 ms 344 KB n = 20, m = 5
9 Correct 1 ms 344 KB n = 18, m = 3
10 Correct 0 ms 348 KB n = 17, m = 2
11 Correct 0 ms 344 KB n = 20, m = 2
12 Correct 1 ms 344 KB n = 17, m = 4
13 Correct 1 ms 600 KB n = 17, m = 6
14 Correct 1 ms 344 KB n = 17, m = 1
15 Correct 0 ms 344 KB n = 17, m = 4
16 Correct 1 ms 500 KB n = 13, m = 3
17 Correct 1 ms 344 KB n = 18, m = 4
18 Correct 1 ms 344 KB n = 20, m = 10
19 Correct 0 ms 348 KB n = 19, m = 10
20 Correct 1 ms 344 KB n = 100, m = 5
21 Correct 0 ms 348 KB n = 90, m = 3
22 Correct 1 ms 344 KB n = 86, m = 2
23 Correct 1 ms 344 KB n = 81, m = 4
24 Correct 0 ms 344 KB n = 89, m = 10
25 Correct 1 ms 348 KB n = 81, m = 23
26 Correct 1 ms 348 KB n = 86, m = 8
27 Correct 1 ms 348 KB n = 53, m = 22
28 Correct 0 ms 348 KB n = 89, m = 35
29 Correct 1 ms 344 KB n = 63, m = 25
30 Correct 1 ms 348 KB n = 100, m = 50
31 Correct 1 ms 344 KB n = 99, m = 50
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB n = 13, m = 1
2 Correct 0 ms 348 KB n = 18, m = 1
3 Correct 0 ms 344 KB n = 17, m = 1
4 Correct 0 ms 344 KB n = 1, m = 1
5 Correct 1 ms 344 KB n = 20, m = 1
6 Correct 1 ms 344 KB n = 20, m = 1
7 Correct 0 ms 344 KB n = 20, m = 1
8 Correct 0 ms 344 KB n = 20, m = 5
9 Correct 1 ms 344 KB n = 18, m = 3
10 Correct 0 ms 348 KB n = 17, m = 2
11 Correct 0 ms 344 KB n = 20, m = 2
12 Correct 1 ms 344 KB n = 17, m = 4
13 Correct 1 ms 600 KB n = 17, m = 6
14 Correct 1 ms 344 KB n = 17, m = 1
15 Correct 0 ms 344 KB n = 17, m = 4
16 Correct 1 ms 500 KB n = 13, m = 3
17 Correct 1 ms 344 KB n = 18, m = 4
18 Correct 1 ms 344 KB n = 20, m = 10
19 Correct 0 ms 348 KB n = 19, m = 10
20 Correct 1 ms 344 KB n = 100, m = 5
21 Correct 0 ms 348 KB n = 90, m = 3
22 Correct 1 ms 344 KB n = 86, m = 2
23 Correct 1 ms 344 KB n = 81, m = 4
24 Correct 0 ms 344 KB n = 89, m = 10
25 Correct 1 ms 348 KB n = 81, m = 23
26 Correct 1 ms 348 KB n = 86, m = 8
27 Correct 1 ms 348 KB n = 53, m = 22
28 Correct 0 ms 348 KB n = 89, m = 35
29 Correct 1 ms 344 KB n = 63, m = 25
30 Correct 1 ms 348 KB n = 100, m = 50
31 Correct 1 ms 344 KB n = 99, m = 50
32 Correct 1 ms 344 KB n = 13, m = 4
33 Correct 0 ms 344 KB n = 86, m = 2
34 Correct 1 ms 344 KB n = 88, m = 2
35 Correct 0 ms 344 KB n = 86, m = 2
36 Correct 0 ms 348 KB n = 81, m = 6
37 Correct 0 ms 344 KB n = 98, m = 7
38 Correct 1 ms 344 KB n = 92, m = 7
39 Correct 1 ms 344 KB n = 88, m = 21
40 Correct 1 ms 344 KB n = 90, m = 21
41 Correct 1 ms 344 KB n = 98, m = 22
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB n = 13, m = 1
2 Correct 0 ms 348 KB n = 18, m = 1
3 Correct 0 ms 344 KB n = 17, m = 1
4 Correct 0 ms 344 KB n = 1, m = 1
5 Correct 1 ms 344 KB n = 20, m = 1
6 Correct 1 ms 344 KB n = 20, m = 1
7 Correct 0 ms 344 KB n = 20, m = 1
8 Correct 0 ms 344 KB n = 20, m = 5
9 Correct 1 ms 344 KB n = 18, m = 3
10 Correct 0 ms 348 KB n = 17, m = 2
11 Correct 0 ms 344 KB n = 20, m = 2
12 Correct 1 ms 344 KB n = 17, m = 4
13 Correct 1 ms 600 KB n = 17, m = 6
14 Correct 1 ms 344 KB n = 17, m = 1
15 Correct 0 ms 344 KB n = 17, m = 4
16 Correct 1 ms 500 KB n = 13, m = 3
17 Correct 1 ms 344 KB n = 18, m = 4
18 Correct 1 ms 344 KB n = 20, m = 10
19 Correct 0 ms 348 KB n = 19, m = 10
20 Correct 1 ms 344 KB n = 100, m = 5
21 Correct 0 ms 348 KB n = 90, m = 3
22 Correct 1 ms 344 KB n = 86, m = 2
23 Correct 1 ms 344 KB n = 81, m = 4
24 Correct 0 ms 344 KB n = 89, m = 10
25 Correct 1 ms 348 KB n = 81, m = 23
26 Correct 1 ms 348 KB n = 86, m = 8
27 Correct 1 ms 348 KB n = 53, m = 22
28 Correct 0 ms 348 KB n = 89, m = 35
29 Correct 1 ms 344 KB n = 63, m = 25
30 Correct 1 ms 348 KB n = 100, m = 50
31 Correct 1 ms 344 KB n = 99, m = 50
32 Correct 1 ms 344 KB n = 13, m = 4
33 Correct 0 ms 344 KB n = 86, m = 2
34 Correct 1 ms 344 KB n = 88, m = 2
35 Correct 0 ms 344 KB n = 86, m = 2
36 Correct 0 ms 348 KB n = 81, m = 6
37 Correct 0 ms 344 KB n = 98, m = 7
38 Correct 1 ms 344 KB n = 92, m = 7
39 Correct 1 ms 344 KB n = 88, m = 21
40 Correct 1 ms 344 KB n = 90, m = 21
41 Correct 1 ms 344 KB n = 98, m = 22
42 Correct 1 ms 344 KB n = 11, m = 2
43 Correct 1 ms 344 KB n = 11, m = 2
44 Incorrect 1 ms 344 KB char #1 differ - expected: '_', found: '?'
45 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB n = 13, m = 1
2 Correct 0 ms 348 KB n = 18, m = 1
3 Correct 0 ms 344 KB n = 17, m = 1
4 Correct 0 ms 344 KB n = 1, m = 1
5 Correct 1 ms 344 KB n = 20, m = 1
6 Correct 1 ms 344 KB n = 20, m = 1
7 Correct 0 ms 344 KB n = 20, m = 1
8 Correct 0 ms 344 KB n = 20, m = 5
9 Correct 1 ms 344 KB n = 18, m = 3
10 Correct 0 ms 348 KB n = 17, m = 2
11 Correct 0 ms 344 KB n = 20, m = 2
12 Correct 1 ms 344 KB n = 17, m = 4
13 Correct 1 ms 600 KB n = 17, m = 6
14 Correct 1 ms 344 KB n = 17, m = 1
15 Correct 0 ms 344 KB n = 17, m = 4
16 Correct 1 ms 500 KB n = 13, m = 3
17 Correct 1 ms 344 KB n = 18, m = 4
18 Correct 1 ms 344 KB n = 20, m = 10
19 Correct 0 ms 348 KB n = 19, m = 10
20 Correct 1 ms 344 KB n = 100, m = 5
21 Correct 0 ms 348 KB n = 90, m = 3
22 Correct 1 ms 344 KB n = 86, m = 2
23 Correct 1 ms 344 KB n = 81, m = 4
24 Correct 0 ms 344 KB n = 89, m = 10
25 Correct 1 ms 348 KB n = 81, m = 23
26 Correct 1 ms 348 KB n = 86, m = 8
27 Correct 1 ms 348 KB n = 53, m = 22
28 Correct 0 ms 348 KB n = 89, m = 35
29 Correct 1 ms 344 KB n = 63, m = 25
30 Correct 1 ms 348 KB n = 100, m = 50
31 Correct 1 ms 344 KB n = 99, m = 50
32 Correct 1 ms 344 KB n = 13, m = 4
33 Correct 0 ms 344 KB n = 86, m = 2
34 Correct 1 ms 344 KB n = 88, m = 2
35 Correct 0 ms 344 KB n = 86, m = 2
36 Correct 0 ms 348 KB n = 81, m = 6
37 Correct 0 ms 344 KB n = 98, m = 7
38 Correct 1 ms 344 KB n = 92, m = 7
39 Correct 1 ms 344 KB n = 88, m = 21
40 Correct 1 ms 344 KB n = 90, m = 21
41 Correct 1 ms 344 KB n = 98, m = 22
42 Correct 1 ms 344 KB n = 11, m = 2
43 Correct 1 ms 344 KB n = 11, m = 2
44 Incorrect 1 ms 344 KB char #1 differ - expected: '_', found: '?'
45 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB n = 13, m = 1
2 Correct 0 ms 348 KB n = 18, m = 1
3 Correct 0 ms 344 KB n = 17, m = 1
4 Correct 0 ms 344 KB n = 1, m = 1
5 Correct 1 ms 344 KB n = 20, m = 1
6 Correct 1 ms 344 KB n = 20, m = 1
7 Correct 0 ms 344 KB n = 20, m = 1
8 Correct 0 ms 344 KB n = 20, m = 5
9 Correct 1 ms 344 KB n = 18, m = 3
10 Correct 0 ms 348 KB n = 17, m = 2
11 Correct 0 ms 344 KB n = 20, m = 2
12 Correct 1 ms 344 KB n = 17, m = 4
13 Correct 1 ms 600 KB n = 17, m = 6
14 Correct 1 ms 344 KB n = 17, m = 1
15 Correct 0 ms 344 KB n = 17, m = 4
16 Correct 1 ms 500 KB n = 13, m = 3
17 Correct 1 ms 344 KB n = 18, m = 4
18 Correct 1 ms 344 KB n = 20, m = 10
19 Correct 0 ms 348 KB n = 19, m = 10
20 Correct 1 ms 344 KB n = 100, m = 5
21 Correct 0 ms 348 KB n = 90, m = 3
22 Correct 1 ms 344 KB n = 86, m = 2
23 Correct 1 ms 344 KB n = 81, m = 4
24 Correct 0 ms 344 KB n = 89, m = 10
25 Correct 1 ms 348 KB n = 81, m = 23
26 Correct 1 ms 348 KB n = 86, m = 8
27 Correct 1 ms 348 KB n = 53, m = 22
28 Correct 0 ms 348 KB n = 89, m = 35
29 Correct 1 ms 344 KB n = 63, m = 25
30 Correct 1 ms 348 KB n = 100, m = 50
31 Correct 1 ms 344 KB n = 99, m = 50
32 Correct 1 ms 344 KB n = 13, m = 4
33 Correct 0 ms 344 KB n = 86, m = 2
34 Correct 1 ms 344 KB n = 88, m = 2
35 Correct 0 ms 344 KB n = 86, m = 2
36 Correct 0 ms 348 KB n = 81, m = 6
37 Correct 0 ms 344 KB n = 98, m = 7
38 Correct 1 ms 344 KB n = 92, m = 7
39 Correct 1 ms 344 KB n = 88, m = 21
40 Correct 1 ms 344 KB n = 90, m = 21
41 Correct 1 ms 344 KB n = 98, m = 22
42 Correct 1 ms 344 KB n = 11, m = 2
43 Correct 1 ms 344 KB n = 11, m = 2
44 Incorrect 1 ms 344 KB char #1 differ - expected: '_', found: '?'
45 Halted 0 ms 0 KB -