Submission #20612

#TimeUsernameProblemLanguageResultExecution timeMemory
20612model_codePaint By Numbers (IOI16_paint)C++11
90 / 100
2000 ms29180 KiB
// name = paint_mark_gordon_n2.cpp, type = cpp.g++

#include "paint.h"
#include <iostream>
#include <cstdlib>
#include <vector>
#include <cstdio>
 
using namespace std;
 
string solve_puzzle(string S, vector<int> C) {
  int M = C.size();
  int N = S.size();
 
  vector<bool> isb(N + 1, false);
  vector<int> cntb(N + 1, 0);
  for (int i = 0; i < N; i++) {
    if (S[i] == 'X') {
      isb[i] = true;
      cntb[i + 1] = 1;
    }
  }
 
  vector<bool> isw(N + 1, false);
  vector<int> cntw(N + 1, 0);
  for (int i = 0; i < N; i++) {
    if (S[i] == '_') {
      isw[i] = true;
      cntw[i + 1] = 1;
    }
  }
 
  for (int i = 1; i <= N; i++) {
    cntb[i] += cntb[i - 1];
    cntw[i] += cntw[i - 1];
  }
 
  vector<vector<bool> > DP_F(N + 1, vector<bool>(M + 1));
 
  DP_F[N][M] = true;
  for (int i = N - 1; i >= 0; i--) {
    for (int j = 0; j <= M; j++) {
      if (!isb[i]) {
        DP_F[i][j] = DP_F[i + 1][j];
      }
      if (j < M && i + C[j] <= N && DP_F[min(N, i + C[j] + 1)][j + 1] &&
            (i + C[j] == N || !isb[i + C[j]]) &&
            cntw[i] == cntw[i + C[j]]) {
        DP_F[i][j] = true;
      }
    }
  }
 
  vector<vector<bool> > DP_R(N + 1, vector<bool>(M + 1));
 
  DP_R[0][0] = true;
  for (int i = 1; i <= N; i++) {
    for (int j = M; j >= 0; j--) {
      if (!isb[i - 1]) {
        DP_R[i][j] = DP_R[i - 1][j];
      }
      if (j > 0 && i - C[j - 1] >= 0 && DP_R[max(0, i - C[j - 1] - 1)][j - 1] &&
            (i - C[j - 1] == 0 || !isb[i - C[j - 1] - 1]) &&
            cntw[i] == cntw[i - C[j - 1]]) {
        DP_R[i][j] = true;
      }
    }
  }
 
  S = "";
  for (int i = 0; i < N; i++) {
    bool canw = false;
    for (int j = 0; j <= M; j++) {
      canw |= !isb[i] && DP_R[i][j] && DP_F[i + 1][j];
    }
     
    bool canb = false;
    for (int j = 0; j < M; j++) {
      for (int k = 0; k < C[j]; k++) {
        if (0 <= i - k && i + C[j] - k <= N) {
          canb |= cntw[i - k] == cntw[i + C[j] - k] &&
                (i - k == 0 || !isb[i - k - 1]) &&
                (i + C[j] - k == N || !isb[i + C[j] - k]) &&
                DP_R[max(0, i - k - 1)][j] &&
                DP_F[min(N, i + C[j] - k + 1)][j + 1];
        }
      }
    }
 
    if (canw && canb) {
      S += '?';
    } else if (canw) {
      S += '_';
    } else if (canb) {
      S += 'X';
    } else {
      S += '*';
    }
  }
 
    return S;
}


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