Submission #584199

#TimeUsernameProblemLanguageResultExecution timeMemory
584199amunduzbaevPaint By Numbers (IOI16_paint)C++17
100 / 100
331 ms332656 KiB
#include "paint.h"
#include "bits/stdc++.h"
using namespace std;
#ifndef EVAL
#include "grader.cpp"
#endif

const int N = 2e5 + 5;
const int K = 105;
int dp[N][K][2], pref[N][2];
int tp[N][K][2], is[N];

string solve_puzzle(string s, vector<int> c) {
	int n = s.size(), k = c.size();
	c.insert(c.begin(), n + 1);
	c.push_back(n + 1);
	s = "#" + s;
	for(int i=1;i<=n;i++){
		pref[i][0] = pref[i-1][0];
		pref[i][1] = pref[i-1][1];
		if(s[i] != '.'){
			pref[i][s[i] == 'X']++;
		}
	}
	
	dp[0][0][0] = 1;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=k;j++){
			if(s[i] != 'X'){
				dp[i][j][0] = dp[i-1][j][1] | dp[i-1][j][0];
			}
			if(i >= c[j] && pref[i][0] - pref[i - c[j]][0] == 0){
				dp[i][j][1] = dp[i - c[j]][j - 1][0];
			}
		}
	}
	
	tp[n + 1][k + 1][0] = 1;
	for(int i=n;i>0;i--){
		for(int j=k + 1;j>0;j--){
			if(s[i] != 'X'){
				tp[i][j][0] = tp[i+1][j][1] | tp[i+1][j][0];
			}
			if(i + c[j] <= n + 1 && pref[i + c[j] - 1][0] - pref[i - 1][0] == 0){
				tp[i][j][1] = tp[i + c[j]][j + 1][0];
			}
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=k;j++){
			if(dp[i][j][1] && tp[i + 1][j + 1][0]){
				is[i - c[j] + 1]++;
				is[i + 1]--;
			}
		}
	}
	
	//~ for(int j=1;j<=k;j++){
		//~ for(int i=1;i<=n;i++){
			//~ cout<<(dp[i][j][1] && tp[i + 1][j + 1][0])<<" ";
		//~ } cout<<"\n";
	//~ }
	
	for(int i=1;i<=n;i++){
		is[i] += is[i-1];
	}
	
	string res;
	for(int i=1;i<=n;i++){
		bool ok = 0;
		for(int j=0;j<=k;j++){
			if(dp[i][j][0] && tp[i][j + 1][0]){
				ok = 1;
			}
		}
		
		if(ok && is[i]){
			res.push_back('?');
		} else if(is[i]){
			res.push_back('X');
		} else if(ok) {
			res.push_back('_');
		} else assert(false);
	}
	
	return res;
}

/*

........
2
3 4

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