Submission #570079

#TimeUsernameProblemLanguageResultExecution timeMemory
570079franfillPaint By Numbers (IOI16_paint)C++17
100 / 100
1539 ms106552 KiB
#include "paint.h"
#include<bits/stdc++.h>
using namespace std;

int n, k;
string s;
vector < int > c;
vector < int > cnt_, cntX;
vector < int > inc_, incX;
vector < vector < int > > memo;

bool has_(int l, int r)
{
	r = min(r, n);
	return cnt_[r] > cnt_[l];
}

bool hasX(int l, int r)
{
	r = min(r, n);
	return cntX[r] > cntX[l];
}

void set_(int l, int r)
{
	inc_[l]++;
	inc_[r]--;
}

void setX(int l, int r)
{
	incX[l]++;
	incX[r]--;
}

bool verifica(int i, int j)
{
	if (j == k) if (!hasX(i, n))
	{
		set_(i, n);
		return 1;
	}
	else return 0;
	if (i >= n) return 0;
	if (i + c[j] >= n) return 0;
	if (memo[i][j] != -1) return memo[i][j];
	bool ok = false;
	if (!has_(i, i+c[j]) && s[i+c[j]] != 'X')
	{
		if (verifica(i+c[j]+1, j+1))
		{
			setX(i, i+c[j]);	
			set_(i+c[j], i+c[j]+1);
			ok = true;
		}
	}
	if (s[i] != 'X')
	{
		if (verifica(i+1, j))
		{
			set_(i, i+1);
			ok = true;
		}
	}
	//cerr << i << " " << j << " " << ok << "\n";
	return memo[i][j] = ok;
}

std::string solve_puzzle(std::string ss, std::vector<int> cc) 
{
	s = ss;
	s += "_";
	c = cc;
	n = s.size();	
	k = c.size();
	memo.resize(n, vector < int > (k, -1));

	cnt_.resize(n+1,0);
	cntX.resize(n+1,0);
	inc_.resize(n+1, 0);
	incX.resize(n+1, 0);
	for (int i = 1; i <= n; i++)
	{
		cnt_[i] = cnt_[i-1] + (s[i-1] == '_');
		cntX[i] = cntX[i-1] + (s[i-1] == 'X');
	}
	string ans = "";
	for (int i = 0; i < n; i++)
	{
		verifica(i, 0);
		if (s[i] == 'X') break;
	}
	int cX=0, c_=0;
	for (int i = 0; i < n-1; i++)
	{
		cX += incX[i];
		c_ += inc_[i];
		assert(cX || c_);
		assert(cX >= 0);
		assert(c_ >= 0);
		if (!cX) ans += "_";
		else if (!c_) ans += "X";
		else ans += "?";
	}
    return ans; 
}

Compilation message (stderr)

paint.cpp: In function 'bool verifica(int, int)':
paint.cpp:38:5: warning: suggest explicit braces to avoid ambiguous 'else' [-Wdangling-else]
   38 |  if (j == k) if (!hasX(i, n))
      |     ^
paint.cpp:66:20: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   66 |  return memo[i][j] = ok;
#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...