Submission #637260

#TimeUsernameProblemLanguageResultExecution timeMemory
637260ggohPaint By Numbers (IOI16_paint)C++14
90 / 100
2099 ms74504 KiB
#include "paint.h"
#include<bits/stdc++.h>
using namespace std;
#define sz(v) ((int)(v).size())
typedef long long lint;

int A[200002][2];
int D[200002][102];
int C[200002];
string S;
int n,m;
int f(int p,int q)
{
    int ret1=0,ret2=0,ret=0;
    if(D[p][q])return D[p][q];
    if(p==n)
    {
        if(q==m)ret=1;
        else ret=-1;
        return D[p][q]=ret;
    }
    if(S[p]=='X'||S[p]=='.')
    {
        if(q==m || p+C[q]-1>=n)ret1=-1;
        else
        {
            for(int k=p;k<=p+C[q]-1;k++)
            {
                if(S[k]=='_')ret1=-1;
            }
            if(ret1!=-1)
            {
                if(S[p+C[q]]=='X')ret1=-1;
                else ret1=f(p+C[q]+1,q+1);
            }
        }
        if(ret1==1)
        {
            for(int k=p;k<=p+C[q]-1;k++)A[k][1]=1;
            A[p+C[q]][0]=1;
        }
    }
    if(S[p]=='_'||S[p]=='.')
    {
        ret2=f(p+1,q);
        if(ret2==1)A[p][0]=1;
    }
    if(ret1==1||ret2==1)ret=1;
    else ret=-1;

    if(S[p]=='X')return D[p][q]=ret1;
    else if(S[p]=='_')return D[p][q]=ret2;
    else return D[p][q]=ret;
}
string solve_puzzle(string s, vector<int> c) {
    string ans;
    S=s;
    S+='_';
    n=S.length();
    m=sz(c);
    for(int i=0;i<m;i++)C[i]=c[i];
    f(0,0);
    for(int i=0;i<n-1;i++)
    {
        if(A[i][0] && A[i][1])ans+='?';
        else if(A[i][0])ans+='_';
        else ans+='X';
    }
    return ans;
}
#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...