Submission #435867

#TimeUsernameProblemLanguageResultExecution timeMemory
435867dutchPaint By Numbers (IOI16_paint)C++17
100 / 100
327 ms42556 KiB
#include <bits/stdc++.h>
using namespace std;
#include "paint.h"

void r(bool &a, bool b){ a = a || b; }

const int LIM = 2e5;

bool dp[2][LIM+2][101];
int n, k;

string solve_puzzle(string s, vector<int> c){
	n = s.size(), k = c.size();
	c.insert(c.begin(), 0);
	s.insert(s.begin(), 0);
 
	int a[n+1] = {0};

	for(int h=0; h<2; ++h){
		for(int i=0; i<=n; ++i) fill(dp[h][i], dp[h][i]+101, 0);
		reverse(c.begin()+1, c.end());
		reverse(s.begin()+1, s.end());

		for(int i=1; i<=n; ++i) a[i] = (s[i] == '_') + a[i-1];

		dp[h][0][0] = 1;
		for(int i=1; i<=n; ++i){
			if(s[i] != 'X') for(int j=0; j<=k; ++j) dp[h][i][j] = dp[h][i-1][j];
			for(int j=1; j<=k; ++j){
				if(i < c[j] || a[i] - a[i-c[j]]) continue;
				if(j < 2) r(dp[h][i][j], dp[h][i-c[j]][j-1]);
				if(j > 1) r(dp[h][i][j], i > c[j] && s[i-c[j]] != 'X' && dp[h][i-c[j]-1][j-1]);
			}
		}
	}
 
	bool possible[n+1];
	for(int i=1; i<n; ++i){
		possible[i] = 0;
		for(int j=0; j<=k; ++j){
			if(dp[1][i-1][j] && dp[0][n-i][k-j] && s[i] != 'X') possible[i] = 1;
		}
	}
	possible[n] = dp[1][n-1][k] && s[n] != 'X';
 
	vector<int> pre(n+2);
 
	s.push_back('.');
 
	for(int i=1; i<=n; ++i){
		for(int j=1; j<=k; ++j){
			if(i < c[j] || a[i] - a[i-c[j]]) continue;
			if(dp[1][max(0, i-c[j]-1)][j-1] && s[i-c[j]] != 'X' && s[i+1] != 'X' && dp[0][max(0, n-i-1)][k-j]) ++pre[i-c[j]+1], --pre[i+1];
		}
	}
 
	string res(n, '?');
 
	for(int i=1; i<=n; ++i){
		pre[i] += pre[i-1];
		if(!pre[i]) res[i-1] = '_';
		if(!possible[i]) res[i-1] = 'X';
	}
 
	return res;
}
#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...