Submission #882514

#TimeUsernameProblemLanguageResultExecution timeMemory
882514JakobZorzPaint By Numbers (IOI16_paint)C++14
7 / 100
1 ms436 KiB
#include"paint.h"
#include<cstdlib>
#include<iostream>
using namespace std;

string str;
vector<int>arr;
int n,m;
bool can_white[200000];
bool can_black[200000];

bool is_possible(int i,int j);

bool is_possible_directly(int i,int j){
    if(j==m)
        return false;
    
    if(i+arr[j]>n)
        return false;
    
    for(int k=i;k<i+arr[j];k++)
        if(str[k]=='_')
            return false;
    
    if(j!=m-1){
        if(i+arr[j]>=n)
            return false;
        if(str[i+arr[j]]=='X')
            return false;
        return is_possible(i+arr[j]+1,j+1);
    }
    
    return is_possible(i+arr[j],j+1);
}

bool is_possible(int i,int j){
    if(i==n)
        return j==m;
    
    if(str[i]=='_')
        return is_possible(i+1,j);
    
    bool nxt=is_possible_directly(i,j);
    if(str[i]=='X')
        return nxt;
    
    return nxt||is_possible(i+1,j);
}

void recurse(int i,int j){
    if(!is_possible(i,j))
        return;
    if(i==n)
        return;
    
    if(is_possible_directly(i,j)){
        for(int k=i;k<i+arr[j];k++)
            can_white[k]=true;
        
        if(j==m-1){
            can_black[i+arr[j]]=true;
            recurse(i+arr[j],j+1);
        }else
            recurse(i+arr[j]+1,j+1);
    }
    
    if(is_possible(i+1,j)){
        can_black[i]=true;
        recurse(i+1,j);
    }
}

string solve_puzzle(string s,vector<int>c){
    str=s;
    arr=c;
    n=(int)s.size();
    m=(int)c.size();
    
    recurse(0,0);
    
    string res;
    res.resize(n);
    for(int i=0;i<n;i++){
        if(can_white[i]&&can_black[i])
            res[i]='?';
        else if(can_white[i])
            res[i]='X';
        else
            res[i]='_';
    }
    return res;
}
#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...