Submission #1357001

#TimeUsernameProblemLanguageResultExecution timeMemory
1357001lizi14Paint By Numbers (IOI16_paint)C++20
7 / 100
1 ms1092 KiB
#include <bits/stdc++.h>
#include "paint.h"
using namespace std;

int pre[200005];

vector<vector<bool>> happy_lama(string bati, vector<int> c1){
    int n = bati.size() - 1;
    int m = c1.size() - 1;

    vector<vector<bool>> dp(n+1, vector<bool>(m+1, 0));
    dp[0][0] = 1;

    for(int i = 1; i <= n; i++){
        for(int j = 0; j <= m; j++){
            int hi = 0;

            
            if(bati[i] != 'X' && dp[i-1][j]){
                hi = 1;
            }

            
            if(j > 0){
                int len = c1[j];
                if(i >= len){
                    int pa = pre[i] - pre[i-len];

                    if(pa == 0){
                        if(i == len){
                            if(dp[0][j-1]) hi = 1;
                        } else {
                            if(bati[i-len] != 'X' && dp[i-len-1][j-1]){
                                hi = 1;
                            }
                        }
                    }
                }
            }

            dp[i][j] = hi;
        }
    }
    return dp;
}

string solve_puzzle(string s, vector<int> c) {

    int n0 = s.size();

    string bati = "*";
    bati += s;

    vector<int> c1 = {0};
    for(int x : c) c1.push_back(x);

    int n = n0;             
    int m = c.size();        

    
    for(int i = 1; i <= n; i++){
        pre[i] = pre[i-1] + (bati[i] == '_');
    }

    auto dp1 = happy_lama(bati, c1);

    string rs = s;
    reverse(rs.begin(), rs.end());

    string bati2 = "*";
    bati2 += rs;

    vector<int> c2 = {0};
    reverse(c.begin(), c.end());
    for(int x : c) c2.push_back(x);

    memset(pre, 0, sizeof(pre));
    for(int i = 1; i <= n; i++){
        pre[i] = pre[i-1] + (bati2[i] == '_');
    }

    auto dp2 = happy_lama(bati2, c2);

    vector<bool> canWhite(n+1, 0), canBlack(n+1, 0);

    
    for(int i = 1; i <= n; i++){
        if(bati[i] == 'X') continue;

        for(int j = 0; j <= m; j++){
            if(dp1[i-1][j] && dp2[n-i][m-j]){
                canWhite[i] = 1;
            }
        }
    }

    for(int j = 1; j <= m; j++){
        int len = c1[j];

        for(int i = 1; i+len-1 <= n; i++){
            int r = i+len-1;

            
            if(pre[r] - pre[i-1] != 0) continue;

            if(i > 1 && bati[i-1] == 'X') continue;
            if(r < n && bati[r+1] == 'X') continue;

            if(dp1[i-1][j-1] && dp2[n-r][m-j]){
                for(int t = i; t <= r; t++){
                    canBlack[t] = 1;
                }
            }
        }
    }

    string res = "";

    for(int i = 1; i <= n; i++){
        if(canWhite[i] && canBlack[i]) res += '?';
        else if(canWhite[i]) res += '_';
        else res += 'X';
    }

    return res;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...