Submission #1150356

#TimeUsernameProblemLanguageResultExecution timeMemory
1150356DobromirAngelovPaint By Numbers (IOI16_paint)C++20
100 / 100
403 ms85828 KiB
#include "paint.h"
#include<bits/stdc++.h>

using namespace std;

const int MAXN=2e5+5;
const int MAXK=105;
const char X='X';
const char O='_';
const char P='*';

int n,k;
string s;
int c[MAXN];
bool dp[2][MAXN][MAXK];
bool dp1[MAXN][MAXK];
bool dp2[MAXN][MAXK];
int prefO[2][MAXN];
int posX[MAXN];

std::string solve_puzzle(std::string S, std::vector<int> C) 
{
    n=S.size();
    k=C.size();
    s='$'+S;
    for(int i=0;i<k;i++) c[i+1]=C[i];
    
    for(int t=0;t<2;t++)
    {   
        for(int i=1;i<=n;i++)
        {
            prefO[t][i]=prefO[t][i-1];
            if(s[i]==O) prefO[t][i]++;
        }
        for(int i=0;i<=n;i++)
        {
            if(s[i]!=X) dp[t][i][0]=1;
            else break;
        }
        for(int j=1;j<=k;j++)
        {
            dp[t][0][j]=0;
            for(int i=1;i<=n;i++)
            {
                if(i<c[j])
                {
                    dp[t][i][j]=0;
                }
                else if(i==c[j])
                {
                    if(j>=2 || prefO[t][i]>0) dp[t][i][j]=0;
                    else dp[t][i][j]=1;
                }
                else
                {
                    if(s[i]==O) dp[t][i][j]=dp[t][i-1][j];
                    else if(s[i]==X)
                    {
                        dp[t][i][j]=dp[t][i-c[j]-1][j-1];
                        if(prefO[t][i]-prefO[t][i-c[j]]>0 || s[i-c[j]]==X) dp[t][i][j]=0;
                    }
                    else
                    {
                        dp[t][i][j]|=dp[t][i-1][j];
                        bool tmp=dp[t][i-c[j]-1][j-1];
                        if(prefO[t][i]-prefO[t][i-c[j]]>0 || s[i-c[j]]==X) tmp=0;
                        dp[t][i][j]|=tmp;
                    }
                }
            }
        }

        reverse(c+1,c+k+1);
        reverse(s.begin()+1,s.begin()+n+1);
    }

    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=k;j++)
        {
            dp1[i][j]=dp[0][i][j];
            dp2[n-i+1][k-j+1]=dp[1][i][j];
        }
    }

    for(int i=1;i<=n;i++)
    {
        if(s[i]==X || s[i]==O) continue;
        for(int j=0;j<=k;j++)
        {
            if(dp1[i-1][j]==1 && dp2[i+1][j+1]==1)
            {
                s[i]=P;
                continue;
            }
        }
        if(s[i]!=P) s[i]=X;
    }

    for(int j=1;j<=k;j++)
    {
        for(int i=1;i<=n-c[j]+1;i++)
        {
            if(prefO[0][i+c[j]-1]-prefO[0][i-1]>0) continue;
            if(s[i-1]==X || s[i+c[j]]==X) continue;
            if(i==1 && j>1) continue;
            if(i==n-c[j]+1 && j<k) continue;
            if(i>1)
            {
                if(dp1[i-2][j-1]==0) continue;
            }
            if(i<n-c[j]+1)
            {
                if(dp2[i+c[j]+1][j+1]==0) continue;
            }
            posX[i]++;
            posX[i+c[j]]--;
        }
    }
    int cur=0;
    for(int i=1;i<=n;i++)
    {
        cur+=posX[i];
        if(s[i]!=P) continue;
        if(cur>0) s[i]='?';
        else s[i]=O;
    }

    for(int i=1;i<=n;i++) S[i-1]=s[i];
    return S;
}

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