제출 #1361455

#제출 시각아이디문제언어결과실행 시간메모리
1361455coderg300711Paint By Numbers (IOI16_paint)C++20
0 / 100
0 ms344 KiB
#include "bits/stdc++.h"
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
#define pll pair<long long,long long>
#define yes cout<<"Yes\n"
#define no cout<<"No\n"
#define pb push_back
#define sz(x) (int)(x).size()
#define rsz resize
#define ass assign
#define F(i,l,r) for(int i=(l);i<(r);++i)
typedef long long ll;
typedef unsigned long long ull;
typedef long double lld;
template<typename T> using pqg = priority_queue<T, vector<T>, greater<T>>;
#define each(a,x) for(auto a:x)
#define FOR(i,a) for(int i=0;i<(a);i++)
#define ROF(i,a,b) for(int i=(b)-1;i>=(a);i--)
#define eb emplace_back
#define ft front()
#define V vector

#include "paint.h"

string solve_puzzle(string s,V<int> c){
	int n=sz(s),k=sz(c);
	V<V<bool>> L(n+2,V<bool>(k+1,0)),R(n+2,V<bool>(k+1,0));
	auto can_fit_black=[&](int st,int len){
		if(st<0 || st+len>n)return 0;
		F(i,st,st+len){
			if(s[i]=='_')return 0;
		}
		return 1;
	};
	L[0][0]=1;
	FOR(j,k+1){
		FOR(i,n+1){
			if(!L[i][j])continue;
			if(i<n && s[i]!='X')L[i+1][j]=1;
			if(j<k){
				int len=c[j];
				if(can_fit_black(i,len)){
					if(i+len==n){
						if(j==k-1)L[n][k]=1;
					}else if(i+len<n && s[i+len]!='X')L[i+len+1][j+1]=1;
				}
			}
			
		}
	}
	R[n][k]=1;
	ROF(j,0,k+1){
		ROF(i,0,n+1){
			if(!R[i][j])continue;
			if(i && s[i-1]!='X')R[i-1][j]=1;
			if(j){
				int len=c[j-1],st=i=len;
				if(can_fit_black(i,len)){
					if(!st){
						if(j==1)R[0][0]=1;
					}else if(st && s[st-1]!='X')R[st-1][j-1]=1;
				}
			}
		}
	}
	V<bool> can_white(n,0),can_black(n,0);
	V<int> bdiff(n+1,0);
	FOR(i,n){
		FOR(j,k+1){
			if(L[i][j] && R[i+1][j]){
				if(s[i]!='X')can_white[i]=1;
			}
		}
	}
	FOR(j,k){
		int len=c[j];
		FOR(p,n-len+1){
			bool ps=L[p][j],suff=(p+len==n)?(j==k-1):R[p+len+1][j+1];
			bool range=can_fit_black(p,len),space=(p+len==n) || (s[p+len]!='X');
			if(ps && suff && range && space){
				bdiff[p]++;
				bdiff[p+len]--;
			}
		}
	}
	int cur=0;
	string res="";
	FOR(i,n){
		cur+=bdiff[i];
		if(cur)can_black[i]=1;
		if(can_black[i] && can_white[i])res+='?';
		else if(can_white[i])res+='X';
		else res+='_';
	}
	return res;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…