제출 #548214

#제출 시각아이디문제언어결과실행 시간메모리
548214ACE_Paint By Numbers (IOI16_paint)C++14
100 / 100
302 ms166692 KiB
#include "paint.h"
#include<bits/stdc++.h>
using namespace std;
#include <cstdlib>
const int N = 2e5 + 5, K = 105;
int dp[N][K], dp2[N][K], ok[N];
std::string solve_puzzle(std::string s, std::vector<int> c) {
	int n = s.size();
	s = '1' + s + '1';
	int m = c.size();
	int prev = 0;
	dp[0][0] = 1;
	for (int i = 1; i <= n; i++) {
		if (s[i] == '_') {
			prev = i;
			for (int j = 0; j <= m; j++) dp[i][j] = dp[i - 1][j];
			continue;
		}
		if (s[i] == '.')
			for (int j = 0; j <= m; j++) dp[i][j] = dp[i - 1][j];

		for (int j = 1; j <= m; j++) {
			if (c[j - 1] <= i && prev <= i - c[j - 1] && s[i - c[j - 1]] != 'X') {

				dp[i][j] |= dp[max(0, i - c[j - 1] - 1)][j - 1];
			}
		}
	}
	prev = n + 1;
	dp2[n + 1][m + 1] = 1;
	for (int i = n; i >= 1; i--) {
		if (s[i] == '_') {
			prev = i;
			for (int j = 1; j <= m + 1; j++) dp2[i][j] = dp2[i + 1][j];
			continue;
		}
		if (s[i] == '.')
			for (int j = 1; j <= m + 1; j++) dp2[i][j] = dp2[i + 1][j];

		for (int j = 1; j <= m; j++) {
			if (c[j - 1] + i - 1 <= n && prev > c[j - 1] + i - 1 && s[i + c[j - 1]] != 'X') {
				dp2[i][j] |= dp2[min(n + 1, i + c[j - 1] + 1)][j + 1];
				if ((dp2[min(n + 1, i + c[j - 1] + 1)][j + 1] && dp[max(0, i - 2)][j - 1] && s[i - 1] != 'X')) {
					ok[i]++; ok[i + c[j - 1]]--;
				}
			}
		}
	}
	string ans = "";
	for (int i = 1; i <= n; i++) {
		ok[i] += ok[i - 1];
		if (s[i] == 'X') ans += 'X';
		else if (s[i] == '_') ans += '_';
		else {
			if (!ok[i]) ans += '_';
			else {
				int f = 0;
				for (int j = 0; j <= m; j++) {
					f |= dp[i - 1][j] & dp2[i + 1][j + 1];
				}
				if (!f) ans += 'X';
				else ans += '?';
			}
		}
	}
	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...