Submission #586911

#TimeUsernameProblemLanguageResultExecution timeMemory
586911AngusRitossaPaint By Numbers (IOI16_paint)C++14
100 / 100
588 ms130288 KiB
#include "paint.h"
#include <bits/stdc++.h>
using namespace std;
int n, k, isblack[200010], iswhite[200010], mxwhite[200010], mxblack[200010], cblack[200010], cwhite[200010], clues[200010];
bool done[200010][110];
int memo[200010][110];
int dp(int a, int b)
{
//	printf("%d %d\n", a, b);
	if (a >= n && b != k) return 0;
	if (a >= n && b == k) return 1;
	if (b == k)
	{
		int w = cblack[n-1];
		if (a) w -= cblack[a-1];
		if (!w)
		{
			mxwhite[a] = max(mxwhite[a], n);
		}
	//	printf("%d %d %d\n", a, b, !w);
		return !w;
	}
	if (done[a][b]) return memo[a][b];
	done[a][b] = 1;
	int sz = clues[b];
	int poss = 0;
	if (!isblack[a]) poss = dp(a+1, b);
	if (poss) mxwhite[a] = max(mxwhite[a], 1);
	if (a + sz > n) return memo[a][b] = poss;
	int w = cwhite[a+sz-1];
	if (a) w -= cwhite[a-1];
	if (w) return memo[a][b] = poss;
	if (isblack[a+sz]) return memo[a][b] = poss;
//	printf(" ab %d %d\n", a, b);
	if (!dp(a+sz+1, b+1)) return memo[a][b] = poss;
//	printf("ab %d %d\n", a, b);
	poss = 1;
	mxblack[a] = max(mxblack[a], sz);
	mxwhite[a+sz] = max(mxwhite[a+sz], 1);
	return memo[a][b] = poss;
}
string solve_puzzle(string s, vector<int> c) {
    n = s.size();
    k = c.size();
    for (int i = 0; i < k; i++) clues[i] = c[i];
    for (int i = 0; i < n; i++)
    {
    	if (s[i] == 'X') isblack[i] = 1;
    	if (s[i] == '_') iswhite[i] = 1;
    	if (i) cblack[i] = cblack[i-1];
    	if (i) cwhite[i] = cwhite[i-1];
    	cwhite[i] += iswhite[i];
    	cblack[i] += isblack[i];
    }
    int poss = dp(0, 0);
    priority_queue<int> pq;
    for (int i = 0; i < n; i++)
    {
    //	printf("%d : %d\n", i, mxwhite[i]);
    	pq.push(-(i + mxwhite[i]));
    	while (!pq.empty() && -pq.top() <= i) { pq.pop(); }
    	if (pq.size()) iswhite[i] = 1;
    }
    while (pq.size()) pq.pop();
    for (int i = 0; i < n; i++)
    {
  //  	printf("%d : %d\n", i, mxblack[i]);
    	pq.push(-(i + mxblack[i]));
    	while (!pq.empty() && -pq.top() <= i) { pq.pop(); }
    	if (pq.size()) isblack[i] = 1;
    }
    string ans;
    for (int i = 0; i < n; i++)
    {
    //	printf("%d %d\n", iswhite[i], isblack[i]);
    	if (iswhite[i] && isblack[i]) ans.push_back('?');
    	else if (iswhite[i]) ans.push_back('_');
    	else if (isblack[i]) ans.push_back('X');
    //	else assert(false);
    }
    return ans;
}

Compilation message (stderr)

paint.cpp: In function 'std::string solve_puzzle(std::string, std::vector<int>)':
paint.cpp:55:9: warning: unused variable 'poss' [-Wunused-variable]
   55 |     int poss = dp(0, 0);
      |         ^~~~
#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...