Submission #1304851

#TimeUsernameProblemLanguageResultExecution timeMemory
1304851neonglitchPaint By Numbers (IOI16_paint)C++20
90 / 100
2097 ms83468 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N=2e5+1,K=101;
struct solver{
	int mx[N];
	bool dp[N][K][2];
	solver()
	{
		
	}
	bool check(string& s,vector<int>& c)
	{
		int n=s.size(),k=c.size();
		for(int i=0;i<=n;i++)
		{
			for(int j=0;j<=k;j++)
			{
				dp[i][j][0]=dp[i][j][1]=0;
			}
		}
		for(int i=0;i<n;i++)
		{
			mx[i]=i;
			while(mx[i]<n and s[mx[i]]!='_' )mx[i]++;
			// exc
		}
		dp[0][0][0]=1;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<=k;j++)
			{
				dp[i+1][j][0]|=((dp[i][j][0]|dp[i][j][1])&(s[i]!='X')); // cell is not black and we can fix before it ending in b or w
				if(j<k and i+c[j] <= mx[i])
				{
					dp[i+c[j]][j+1][1]|=(dp[i][j][0]);
				}
			}
		}
		return dp[n][k][0]|dp[n][k][1];
	}
};

string solve_puzzle(string s,vector<int> c)
{
	int n=s.size();
	int k=c.size();
	string ans;
	
	solver ff;
	solver ss;
	
	ff.check(s,c);
	reverse(begin(s),end(s));
	reverse(begin(c),end(c));
	ss.check(s,c);
	
	reverse(begin(s),end(s));
	reverse(begin(c),end(c));
	
	vector<int> cbw(n+1),cbb(n+1);
	for(int i=0;i<n;i++)
	{
		if(s[i]!='.')
		{
			
		}
		else{
			for(int j=0;j<=k;j++)
			{
				if(ff.dp[i+1][j][0] && ss.dp[n-i][k-j][0])
				{
					cbw[i]=1;
				}					
			}
		}
	}
	for(int j=0;j<k;j++)
	{
		for(int i=0;i+c[j]<=n;i++)
		{
			// let index i,i+1,..,i+c[j]-1 a block and try to solve it
			if(i+c[j]<=ff.mx[i] && ff.dp[i][j][0] && ss.dp[n-i-c[j]][k-1-j][0])
			{
				cbb[i]++;
				cbb[i+c[j]]--;
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		if(i)cbb[i]+=cbb[i-1];
		if(s[i]!='.')
		{
			ans+=s[i];
		}
		else{
			if(cbb[i]>0 and cbw[i]>0)ans+='?';
			else if(cbb[i]>0)ans+='X';
			else ans+='_';
		}
	}
	return ans;
// 	return ans;
}
// int main()
// {
// 	ios::sync_with_stdio(0);
// 	cin.tie(0);
// 	cout.tie(0);
// 	string s;
// 	cin>>s;
// 	int k;
// 	cin>>k;
// 	vector<int> c(k);
// 	for(auto&i:c)cin>>i;
// 	cout<<solve_puzzle(s,c)<<endl;
// }

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...