Submission #1189772

#TimeUsernameProblemLanguageResultExecution timeMemory
1189772stdfloatPaint By Numbers (IOI16_paint)C++20
100 / 100
283 ms8380 KiB
#include <bits/stdc++.h>
#include "paint.h"
// #include "grader.cpp"
using namespace std;

string solve_puzzle(string s, vector<int> C) {
	int n = (int)s.size(), m = (int)C.size();

	s = ' ' + s; C.insert(C.begin(), 0);

	vector<int> p1(n + 1), p2(n + 1);
	for (int i = 1; i <= n; i++) {
		p1[i] = p1[i - 1] + (s[i] == '_');
		p2[i] = p2[i - 1] + (s[i] == 'X');
	}

	vector<vector<bool>> dp1(m + 1, vector<bool>(n + 1));
	for (int i = 0; i <= n && !p2[i]; i++)
		dp1[0][i] = true;
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			if (s[j] != 'X') dp1[i][j] = dp1[i][j - 1];
			if (s[j] != '_' && C[i] <= j && p1[j] == p1[j - C[i]] && s[j - C[i]] != 'X')
				dp1[i][j] = dp1[i][j] || C[i] == j || dp1[i - 1][j - C[i] - 1];
		}

		if (i == 1) s[0] = 'X';
	}
	s[0] = '.';

	p1 = p2 = vector<int>(n + 3);
	for (int i = n; i >= 0; i--) {
		p1[i] = (s[i] == '_') + p1[i + 1];
		p2[i] = (s[i] == 'X') + p2[i + 1];
	}
	vector<vector<bool>> dp2(m + 2, vector<bool>(n + 3));
	for (int i = n + 2; i >= 0 && !p2[i]; i--)
		dp2[m + 1][i] = true;

	s += '.';
	for (int i = m; i > 0; i--) {
		for (int j = n; j > 0; j--) {
			if (s[j] != 'X') dp2[i][j] = dp2[i][j + 1];
			if (s[j] != '_' && j + C[i] <= n + 1 && p1[j] == p1[j + C[i]] && s[j + C[i]] != 'X')
				dp2[i][j] = dp2[i][j] || dp2[i + 1][j + C[i] + 1];
		}

		if (i == m) s[n + 1] = 'X';
	}
	s.erase(--s.end());

	vector<int> p(n + 3);
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j + C[i] <= n + 1; j++) {
			if (((j == 1 && i == 1) || (1 < j && dp1[i - 1][j - 2])) && s[j - 1] != 'X' && p1[j + C[i]] == p1[j] && s[j + C[i]] != 'X' && dp2[i + 1][j + C[i] + 1]) {
				p[j]++; p[j + C[i]]--;
			}
		}
	}
	for (int i = 1; i <= n; i++)
		p[i] += p[i - 1];

	string ans = s;
	for (int i = 1; i <= n; i++) {
		if (s[i] != '.') continue;

		if (!p[i]) {
			ans[i] = '_'; continue;
		}

		bool tr = false;
		for (int j = 0; j <= m && !tr; j++)
			tr = dp1[j][i - 1] && dp2[j + 1][i + 1];

		ans[i] = (tr ? '?' : 'X');
	}

	ans.erase(ans.begin());

	return ans;
}

Compilation message (stderr)

paint.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
paint_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...