Submission #1247540

#TimeUsernameProblemLanguageResultExecution timeMemory
1247540julia_08Paint By Numbers (IOI16_paint)C++20
100 / 100
275 ms176772 KiB
#include "paint.h"
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 2e5 + 10;
const int MAXK = 110;

int dp_pref[MAXN][MAXK], dp_suf[MAXN][MAXK];

int sum_b[MAXN], sum_w[MAXN];

int white[MAXN], black[MAXN];

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

  int n = s.size();
  int k = c.size();

  s = " " + s;

  for(int i=1; i<=n; i++){
    sum_b[i] = sum_b[i - 1] + (s[i] == 'X');
    sum_w[i] = sum_w[i - 1] + (s[i] == '_');
  }

  dp_pref[0][0] = 1;

  for(int i=1; i<=n; i++){
    for(int j=0; j<=k; j++){

      // black
      if(j > 0){

        if(i == c[j - 1]){
          dp_pref[i][j] |= (dp_pref[i - c[j - 1]][j - 1] && (sum_w[i] - sum_w[i - c[j - 1]] == 0));
        }

        if(i > c[j - 1]){
          dp_pref[i][j] |= (dp_pref[i - c[j - 1] - 1][j - 1] && (sum_w[i] - sum_w[i - c[j - 1]] == 0) && s[i - c[j - 1]] != 'X');
        }

      }

      // white
      if(s[i] != 'X') dp_pref[i][j] |= dp_pref[i - 1][j];

    }
  }

  dp_suf[n + 1][0] = 1;

  for(int i=n; i>=1; i--){
    for(int j=0; j<=k; j++){

      // black
      if(j > 0){

        if(i + c[k - j] - 1 == n){
          dp_suf[i][j] |= (dp_suf[i + c[k - j]][j - 1] && (sum_w[i + c[k - j] - 1] - sum_w[i - 1] == 0));
        }

        if(i + c[k - j] - 1 < n){
          dp_suf[i][j] |= (dp_suf[i + c[k - j] + 1][j - 1] && (sum_w[i + c[k - j] - 1] - sum_w[i - 1] == 0) && s[i + c[k - j]] != 'X');
        }

      }

      // white
      if(s[i] != 'X') dp_suf[i][j] |= dp_suf[i + 1][j];

    }
  }

  for(int i=1; i<=n; i++){
    for(int j=0; j<=k; j++){

      // black
      if(j > 0){

        bool can_pref = false;
        bool can_suf = false;

        if(i == c[j - 1]){
          can_pref = (dp_pref[0][j - 1] && (sum_w[i] - sum_w[i - c[j - 1]] == 0));
        } else if(i > c[j - 1]){
          can_pref = (dp_pref[i - c[j - 1] - 1][j - 1] && (s[i - c[j - 1]] != 'X') && (sum_w[i] - sum_w[i - c[j - 1]] == 0));
        }

        if(i < n - 1){
          can_suf = (dp_suf[i + 2][k - j] && (s[i + 1] != 'X')); 
        } else if(i == n - 1){
          can_suf = ((j == k) && (s[i + 1] != 'X'));
        } else if(i == n) can_suf = (j == k);

        if(can_pref && can_suf){
          black[i - c[j - 1] + 1] ++;
          black[i + 1] --;
        }

      }

      // white
      if(s[i] != 'X') white[i] |= (dp_pref[i - 1][j] && dp_suf[i + 1][k - j]);

    }
  }

  for(int i=1; i<=n; i++) black[i] += black[i - 1];

  string ans;

  for(int i=1; i<=n; i++){
    if(black[i] && white[i]){
      ans.push_back('?');
    } else if(black[i]){
      ans.push_back('X');
    } else ans.push_back('_');
  }

  return ans;

}

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