Submission #882535

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

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

bool is_possible(int i,int j);

bool dpt1[200001][101];
bool dp1[200001][101];
bool is_possible_directly(int i,int j){
    if(dpt1[i][j])
        return dp1[i][j];
    dpt1[i][j]=true;
    
    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(next_[i]<i+arr[j])
        return false;
    
    if(j==m-1){
        dp1[i][j]=is_possible(i+arr[j],j+1);
        return dp1[i][j];
    }
    
    if(i+arr[j]>=n)
        return false;
    if(str[i+arr[j]]=='X')
        return false;
    dp1[i][j]=is_possible(i+arr[j]+1,j+1);
    return dp1[i][j];
}

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

bool vis[200001][201];
void recurse(int i,int j){
    if(vis[i][j])
        return;
    vis[i][j]=true;
    
    if(!is_possible(i,j))
        return;
    if(i==n)
        return;
    
    if(is_possible_directly(i,j)){
        can_white[i]++;
        can_white[i+arr[j]]--;
        
        if(j==m-1)
            recurse(i+arr[j],j+1);
        else{
            can_black[i+arr[j]]=true;
            recurse(i+arr[j]+1,j+1);
        }
    }
    
    if(is_possible(i+1,j)&&str[i]!='X'){
        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();
    
    int curr_=n;
    for(int i=n-1;i>=0;i--){
        if(str[i]=='_')
            curr_=i;
        next_[i]=curr_;
    }
    
    recurse(0,0);
    
    string res;
    res.resize(n);
    int white=0;
    for(int i=0;i<n;i++){
        white+=can_white[i];
        if(white&&can_black[i])
            res[i]='?';
        else if(white)
            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...