제출 #1237809

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

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

  vector<int> qsumb(s.size());

  qsumb[0] = s[0] == '_';
  for (int i = 1; i < s.size(); i++)
    qsumb[i] = qsumb[i - 1] + (s[i] == '_');

  auto qryb = [&](int l, int r) {
    if (l == 0)
      return qsumb[r];
    return qsumb[r] - qsumb[l - 1];
  };

  vector<vector<bool>> vvb(c.size() + 1, vector<bool>(s.size() + 1)),
      suf(c.size() + 1, vector<bool>(s.size() + 1));

  vvb[0][0] = 1;

  for (int i = 0; i < s.size(); i++) {
    if (s[i] == 'X')
      break;
    vvb[0][i + 1] = 1;
  }

  for (int i = 1; i <= c.size(); i++) {
    for (int j = 1; j <= s.size(); j++) {
      if (s[j - 1] != 'X') {
        vvb[i][j] = vvb[i][j] || vvb[i][j - 1];
      }
      if (s[j - 1] != '_') {
        if ((j - c[i - 1] < 0) || (qryb(j - c[i - 1], j - 1) != 0)) {
        } else if (i == 1) {
          vvb[i][j] = 1;
        } else if (j - c[i - 1] - 1 >= 0 && s[j - c[i - 1] - 1] != 'X' &&
                   vvb[i - 1][j - c[i - 1] - 1]) {
          vvb[i][j] = 1;
        }
      }
    }
  }

  suf[c.size()][s.size()] = 1;

  for (int i = s.size() - 1; i >= 0; i--) {
    if (s[i] == 'X')
      break;
    suf[c.size()][i] = 1;
  }

  for (int i = c.size() - 1; i >= 0; i--) {
    for (int j = s.size() - 1; j >= 0; j--) {
      if (s[j] != 'X') {
        suf[i][j] = suf[i][j] || suf[i][j + 1];
      }
      if (s[j] != '_') {
        if ((j + c[i] - 1 >= s.size()) || (qryb(j, j + c[i] - 1) != 0)) {
        } else if (i == c.size() - 1) {
          suf[i][j] = 1;
        } else if (j + c[i] + 1 <= s.size() && s[j + c[i]] != 'X' &&
                   suf[i + 1][j + c[i] + 1]) {
          suf[i][j] = 1;
        }
      }
    }
  }

  vector<bool> canw(s.size());
  vector<int> canb(s.size() + 1);

  for (int i = 0; i <= c.size(); i++) {
    for (int j = 0; j < s.size(); j++) {
      canw[j] = canw[j] || (vvb[i][j] && suf[i][j+1]);
    }
  }

  for (int i = 0; i < c.size(); i++) {
    for (int j = 0; j < s.size(); j++) {
      bool can = 1;

      if (j != 0)
        can = can && (s[j - 1] != 'X');
      if (j + c[i] < s.size())
        can = can && (s[j + c[i]] != 'X');

      if ((j + c[i] - 1 >= s.size()) || qryb(j, j + c[i] - 1) != 0)
        continue;

      can = can && vvb[i][j] && suf[i + 1][j + c[i]];

      if (can) {
        canb[j]++;
        canb[j + c[i]]--;
      }
    }
  }

  vector<bool> vbb(s.size());
  int cur = 0;
  for (int i = 0; i < s.size(); i++) {
    cur += canb[i];
    if (cur > 0)
      vbb[i] = 1;
  }

  string ans;
  for (int i = 0; i < s.size(); i++)
    if (s[i] != '.')
      ans.push_back(s[i]);
    else {
      if (canw[i] && vbb[i])
        ans.push_back('?');
      else if (canw[i])
        ans.push_back('_');
      else
        ans.push_back('X');
    }

  return ans;
}

컴파일 시 표준 에러 (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...