제출 #42773

#제출 시각아이디문제언어결과실행 시간메모리
42773funcsrPaint By Numbers (IOI16_paint)C++14
80 / 100
2056 ms1668 KiB
#include "paint.h"
#include <iostream>
#include <vector>
#include <string>
#include <cassert>
using namespace std;
#define rep(i, n) for (int i=0; i<(n); i++)

int N, K;
int C[100];
bool dp[100001][101];
int white[100001], black[100001];
inline int range_white(int l, int r) { return white[r]-(l>0?white[l-1]:0); }
inline int range_black(int l, int r) { return black[r]-(l>0?black[l-1]:0); }
bool f(string S) {
  rep(i, N+1) rep(j, K+1) dp[i][j] = false;
  rep(i, N) white[i] = S[i]=='_', black[i] = S[i]=='X';
  rep(i, N-1) white[i+1] += white[i], black[i+1] += black[i];

  dp[0][0] = true;
  rep(i, N) {
    if (range_black(i, i)) continue;
    rep(k, K+1) dp[i+1][k] |= dp[i][k];
    rep(k, K) {
      int l = i-C[k];
      if (range_white(l, i-1) == 0) dp[i+1][k+1] |= dp[l][k];
    }
  }
  return dp[N][K];
}

string solve_puzzle(string S, vector<int> c) {
  S += '_';
  N = S.length();
  K = c.size();
  rep(i, K) C[i] = c[i];
  string O(S);

  assert(f(S));
  rep(i, N) {
    if (S[i] != '.') continue;
    S[i] = 'X';
    if (!f(S)) {
      O[i] = '_';
    }
    else {
      S[i] = '_';
      if (!f(S)) {
        O[i] = 'X';
      }
      else {
        O[i] = '?';
      }
    }
    S[i] = '.';
  }
  O.pop_back();
  return O;
}
#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...