Submission #292525

#TimeUsernameProblemLanguageResultExecution timeMemory
292525MoNsTeR_CuBePaint By Numbers (IOI16_paint)C++17
90 / 100
2087 ms176068 KiB
#include "paint.h"

#include <cstdlib>
#include <bits/stdc++.h>
using namespace std;

int n;
int maxK;
vector <int > c;
#define int long long 
vector< vector <int > > memo;

vector< int > pref;

vector<int> w;
vector<int> b;

vector< int > prefB;

string s;

bool dp(int position, int k){
	if(k == maxK){
		if(position < n){
			if(s[position] == 'X') return false;
			if(dp(position+1, k)){
				w[position] = true;
				return true;
			}else{
				return false;
			}
		}
	}
	if(k >= maxK) return true;
	if(position >= n){
		return false;
	}
	if(memo[position][k] != -1){
		return memo[position][k];
	}
	
	memo[position][k] = 0;
	if(s[position] != 'X'){
		w[position] |= dp(position+1, k);
		memo[position][k] |= dp(position+1, k);
	}
	int deb = 0;
	if(position >= 1) deb = pref[position-1];
	if(pref[position+c[k]-1]-deb == 0 && (position == 0 || s[position-1] != 'X') && (position+c[k] >= n || s[position+c[k]] != 'X') && position+c[k]-1 < n){
		bool ok = dp(position+c[k]+1, k+1);
		if(ok){
			
			prefB[position]++;
			if(position+c[k] < n) prefB[position+c[k]]--;
			if(position) w[position-1] = true;
			if(position+c[k] < n) w[position+c[k]] = true;
			memo[position][k] |= dp(position+c[k]+1, k+1);
		}
	}
	//cout << "DP " << position << ' ' << k << ' ' << memo[position][k] << endl;
	return memo[position][k];
}
#undef int
std::string solve_puzzle(std::string S, std::vector<int> C) {
    #define int long long
    n = S.size();
    maxK = C.size();
    memo.resize(n, vector< int > (maxK));
    for(int i = 0 ; i < n; i++){
		for(int j = 0; j < maxK; j++){
			memo[i][j] = -1;
		}
	}
    c=C;
    s = S;
    prefB.resize(n,0);
    pref.resize(n,0);
    b.resize(n,0);
    w.resize(n,0);
    for(int i = 0; i<n; i++){
		if(i) pref[i] += pref[i-1];
		pref[i] += (s[i] == '_');
	}
	dp(0,0);
	int curr = 0;
	for(int i = 0; i < n; i++){
		curr += prefB[i];
		if(curr) b[i] = true;
	}
	string ans = "";
	for(int i = 0; i < n; i++){
		if(b[i] && w[i]){
			ans += '?';
		}else if(w[i]){
			ans += '_';
		}else if(b[i]){
			ans += 'X';
		}
	}
	return ans;
	
}
#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...