Submission #125805

#TimeUsernameProblemLanguageResultExecution timeMemory
125805tinjyuPaint By Numbers (IOI16_paint)C++14
90 / 100
2053 ms2936 KiB
#include "paint.h"

#include <cstdlib>
#include <iostream>
using namespace std;
long long int lastx,w[200005],b[200005],m,n,c[5005],tag[105][200005];
string s;
string a;
long long int find(int p,int now)
{
	//cout<<p<<" "<<now<<endl;
	if(tag[p][now]!=0)return tag[p][now];
	if(p==m)
	{
		//cout<<now<<" "<<lastx<<endl;
		if(now-1<lastx)return 2;
		return 1;
	}
	
	tag[p][now]=2;
	long long int maxb=-1,maxw=-1;
	for(int i=now;i<c[p]+now;i++)if(s[i]=='_')maxw=i;
	for(int i=now;i<c[p]+now;i++)
	{
		
		if(s[i]=='X')
		{
			maxb=i;
			break;
		}
	}
	for(int i=now;i+c[p]-1<n;i++)
	{
		//cout<<i<<endl;
		long long int cnt=0;
		if(s[i+c[p]-1]=='X' && maxb==-1)maxb=i+c[p]-1;
		if(i>maxb && maxb!=-1)break;
		if(s[i+c[p]-1]=='_')maxw=i+c[p]-1;
		if(cnt==1 || s[c[p]+i]=='X' || maxw>=i)continue;
		if(find(p+1,i+c[p]+1)==1)
		{
			//cout<<p<<" "<<now<<" "<<i<<endl;
			//cout<<a<<endl;
			tag[p][i]=1;
			for(int j=now;j<i;j++)
			{
				if(a[j]=='.')a[j]='_';
				if(a[j]=='X')a[j]='?';
			}
			//cout<<a<<endl;
			for(int j=i;j<i+c[p];j++)
			{
				if(a[j]=='.')a[j]='X';
				if(a[j]=='_')a[j]='?';
			}
			//cout<<a<<endl;
			if(p!=m-1)
			{
				if(a[i+c[p]]=='.')a[i+c[p]]='_';
				if(a[i+c[p]]=='X')a[i+c[p]]='?';
			}
			else
			{
				for(int j=i+c[p];j<n;j++)
				{
					if(a[j]=='.')a[j]='_';
					if(a[j]=='X')a[j]='?';
				}
			}
			tag[p][now]=1;
			//cout<<a<<endl;
		}
	}
	return tag[p][now];
}
std::string solve_puzzle(std::string x, std::vector<int> l) {
    s=x;
    a=x;
    m=l.size();
    n=s.length();
    lastx=-1;
    for(int i=0;i<n;i++)
	{
		a[i]=s[i];
		if(s[i]=='X')lastx=i;
	}
    for(int i=0;i<m;i++)c[i]=l[i];
    find(0,0);
    //cout<<a<<endl;
	return a;
}
#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...