Submission #1234391

#TimeUsernameProblemLanguageResultExecution timeMemory
1234391ArturgoPaint By Numbers (IOI16_paint)C++20
59 / 100
1 ms328 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); }

Compilation message (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...