# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
321513 | Kuuhaku | Paint By Numbers (IOI16_paint) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//Nov11-2020
#define tasknames "bblock"
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
using namespace std;
const int maxn=2e5+2;
const int maxc=102;
int n, k, c[maxn], type[maxc][maxn], demw[maxn], ch_b[maxn], ch_w[maxn];
string s;
bool vs[maxc][maxn];
void Enter()
{
cin>>s>>k;
n=s.length();
for(int i=1;i<=k;i++)
cin>>c[i];
s="."+s;
for(int i=1;i<=n;i++)
{
demw[i]=demw[i-1];
if(s[i]=='_')demw[i]++;
}
int j=0;
while(j<=n&&s[j]!='X')
{
type[0][j]=2;
j++;
}
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)
{
bool add_b=(j>=c[i]&&type[i-1][j-c[i]]>1&&demw[j]==demw[j-c[i]]) ? 1 : 0;
bool add_w=(type[i][j-1]>0&&s[j]!='X') ? 1 : 0;
if(add_b&&!add_w)type[i][j]=1;
if(!add_b&&add_w)type[i][j]=2;
if(add_b&&add_w)type[i][j]=3;
}
}
void Calc(int i,int j)
{
if(i<0||j<0)return;
if(vs[i][j])return;
vs[i][j]=true;
if(type[i][j]==1||type[i][j]==3)
{
ch_b[j-c[i]+1]++;
ch_b[j+1]--;
ch_w[j-c[i]]++;
Calc(i-1,j-c[i]-1);
}
if(type[i][j]==2||type[i][j]==3)
{
ch_w[j]++;
Calc(i,j-1);
}
}
string solve_puzzle(string s,vector<int> a)
{
Calc(k,n);
int sum=0;
string ans="";
for(int i=1;i<=n;i++)
{
sum+=ch_b[i];
if(sum>0&&ch_w[i]>0)
ans+="?";
else
{
if(sum>0&&ch_w[i]==0)
ans+="X";
else ans+="_";
}
}
return ans;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
if(fopen(tasknames".INP","r"))
{
freopen(tasknames".INP","r",stdin);
freopen(tasknames".OUT","w",stdout);
}
Enter();
cout<<solve_puzzle(s,c);
}