제출 #1234390

#제출 시각아이디문제언어결과실행 시간메모리
1234390ArturgoPaint By Numbers (IOI16_paint)C++20
7 / 100
0 ms332 KiB
#include<bits/stdc++.h>
// #include "paint.h"
#include <cstdlib>
using namespace std;

vector<vector<bool>> calcule_dp(string indices, vector<int> blocs) {
    vector<vector<bool>> dp(indices.size(), vector<bool>(blocs.size() + 1, false));

    vector<int> nbBlancsAvant(indices.size() + 1, 0);
    for(int pos = 0;pos <= (int)indices.size();pos++) {
        nbBlancsAvant[pos + 1] = nbBlancsAvant[pos] + (int)(indices[pos] == '_');
    }
    
    dp[0][0] = true;
    for(int pos = 0;pos < indices.size();pos++) {
        for(int blocs_poses = 0;blocs_poses <= blocs.size();blocs_poses++) {
            if(!dp[pos][blocs_poses]) continue;

            if(blocs_poses < blocs.size()
            && pos + blocs[blocs_poses] + 1 < indices.size()
            && nbBlancsAvant[pos + blocs[blocs_poses] + 1] == nbBlancsAvant[pos + 1]) {
                dp[pos + blocs[blocs_poses] + 1][blocs_poses + 1] = true;
            }

            if(pos + 1 < indices.size()
            && indices[pos + 1] != 'X') {
                dp[pos + 1][blocs_poses] = true;
            }
        }
    }

    return dp;
}

string solve_puzzle(string indices, vector<int> blocs) {
    indices = "_" + indices + "_";

    auto rindices = indices; reverse(rindices.begin(), rindices.end());
    auto rblocs = blocs; reverse(rblocs.begin(), rblocs.end());
    auto dpAvant = calcule_dp(indices, blocs);
    auto dpApres = calcule_dp(rindices, rblocs);
    reverse(dpApres.begin(), dpApres.end());
    
    for(int pos = 1;pos < indices.size() - 1;pos++) {
        bool peutBlanc = false;
        for(int blocs_avant = 0;blocs_avant <= blocs.size();blocs_avant++) {
            peutBlanc |= (dpAvant[pos][blocs_avant] && dpApres[pos][blocs.size() - blocs_avant]);
        }
        if(!peutBlanc) indices[pos] = 'X';
    }

    vector<int> nbBlancsAvant(indices.size() + 1, 0);
    for(int pos = 0;pos <= (int)indices.size();pos++) {
        nbBlancsAvant[pos + 1] = nbBlancsAvant[pos] + (int)(indices[pos] == '_');
    }

    vector<int> delta(indices.size() + 1, 0);
    for(int pos = 0;pos < indices.size();pos++) {
        for(int blocs_avant = 0;blocs_avant < blocs.size();blocs_avant++) {
            if(pos + blocs[blocs_avant] + 1 < indices.size()
            && dpAvant[pos][blocs_avant] 
            && dpApres[pos + blocs[blocs_avant] + 1][blocs.size() - 1 - blocs_avant]
            && nbBlancsAvant[pos + blocs[blocs_avant] + 1] == nbBlancsAvant[pos + 1]) {
                delta[pos + 1] += 1;
                delta[pos + blocs[blocs_avant] + 1] -= 1;
            }
        }
    }

    int somme = 0;
    for(int pos = 0;pos < indices.size();pos++) {
        somme += delta[pos];
        if(somme == 0) {
            indices[pos] = '_';
        }
    }

    replace(indices.begin(), indices.end(), '.', '?');
    return string(indices.begin() + 1, indices.end() - 1);
}

컴파일 시 표준 에러 (stderr) 메시지

paint.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
paint_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...