Submission #105777

#TimeUsernameProblemLanguageResultExecution timeMemory
105777RezwanArefin01Paint By Numbers (IOI16_paint)C++17
90 / 100
12 ms4944 KiB
#include <bits/stdc++.h>
#include "paint.h"
using namespace std; 

const int N = 2e5 + 1; 
bool f[N][105], g[N][105], can_b[N], can_w[N]; 
int c[105], black[N], white[N], t[N], n, k;
	
string solve_puzzle(string _s, vector<int> _c) {
	n = _s.size(), k = _c.size(); 
	copy(_c.begin(), _c.end(), c + 1); 
	string s = "." + _s + "."; 

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

	f[0][0] = 1; 
	for(int i = 1; i <= n; i++) {
		f[i][0] = black[i] == 0; 
		for(int j = 1; j <= k; j++) {
			bool w = f[i - 1][j]; 
			bool b = (i >= c[j]) & (s[i - c[j]] != 'X') & (white[i] == white[i - c[j]]) 
				 	&(i > c[j] ? f[i - c[j] - 1][j - 1] : (j == 1)); 
			f[i][j] = s[i] == '_' ? w : s[i] == 'X' ? b : (w | b); 
		}
	}

	g[n + 1][k + 1] = g[n + 2][k + 1] = 1; 
	for(int i = n; i >= 1; i--) {
		g[i][k + 1] = black[n] == black[i - 1]; 
		for(int j = k; j >= 1; j--) {
			bool w = g[i + 1][j]; 
			bool b = (n - i + 1 >= c[j]) & (s[i + c[j]] != 'X') & (white[i - 1] == white[i + c[j] - 1])  
					& g[i + c[j] + 1][j + 1]; 
			g[i][j] = s[i] == '_' ? w : s[i] == 'X' ? b : (w | b); 
		}
	}

	for(int i = 1; i <= n; i++) {
		if(s[i] == '_') can_w[i] = 1; 
		else {
			for(int c = 0; c <= k && !can_w[i]; c++) {
				can_w[i] |= f[i - 1][c] && g[i + 1][c + 1]; 
			}
		}
		for(int j = 1; j <= k; j++) {
			if(i >= c[j] && s[i - c[j]] != 'X' && s[i + 1] != 'X' && white[i] == white[i - c[j]] &&
			   (i > c[j] ? f[i - c[j] - 1][j - 1] : (j == 1)) && g[i + 2][j + 1]) {
				t[i - c[j] + 1]++; t[i + 1]--; 
			}
		}
	}

	for(int i = 1; i <= n; i++) {
		t[i] += t[i - 1]; 
		can_b[i] = t[i] > 0; 
	}

	string ans = ""; 
	for(int i = 1; i <= n; i++) {
		if(s[i] != '.') ans += s[i]; 
		else {
			if(can_w[i] && can_b[i]) ans += '?'; 
			else ans += (can_w[i] ? '_' : '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...