Submission #963620

#TimeUsernameProblemLanguageResultExecution timeMemory
963620hirayuu_ojPaint By Numbers (IOI16_paint)C++17
100 / 100
476 ms262224 KiB
#include "paint.h"
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(n); i++)
#define all(x) x.begin(),x.end()
using ll=long long;
const ll INF=1LL<<60;
string to_string(string s){
    return s;
}
string to_string(char c){
    string ret="";
    ret+=c;
    return ret;
}
template<class S,class T>
string to_string(pair<S,T> x){
    string ret="("+to_string(x.first)+","+to_string(x.second)+")";
    return ret;
}
template<class S>
string to_string(S x){
    string ret="{";
    bool flg=0;
    for(auto i:x){
        if(flg)ret+=",";
        ret+=to_string(i);
        flg=1;
    }
    ret+="}";
    return ret;
}

void debug(){
    cerr<<"\n";
}
template<class S,class... T>
void debug(S x,T... y){
    cerr<<to_string(x)<<" ";
    debug(y...);
}
//#define DEBUG

#ifdef DEBUG
#define DBG(x...) cerr<<"DBG:";debug(x)
#else
#define DBG(x...)
#endif

std::string solve_puzzle(std::string s, std::vector<int> c) {
    string fin=s;
    s="_"+s+"_";
    DBG(s,c);
    int n=s.size();
    int m=c.size();
    vector<vector<int>> dp1(n,vector<int>(m+1,0));
    vector<vector<int>> dp2(n,vector<int>(m+1,0));
    rep(r,2){
        vector<int> cum(n+1,0);
        rep(i,n){
            cum[i+1]=cum[i];
            if(s[i]=='_')cum[i+1]++;
        }
        vector<vector<int>> dp(n,vector<int>(m+1,0));
        dp[0][0]=1;
        rep(i,n-1){
            rep(j,m+1){
                if(!dp[i][j])continue;
                if(s[i+1]!='X'){
                    dp[i+1][j]=1;
                }
                if(j==m)continue;
                if(i+c[j]+1<n&&s[i+c[j]+1]!='X'){
                    if(cum[i+c[j]+1]-cum[i+1]==0){
                        dp[i+c[j]+1][j+1]=1;
                    }
                }
            }
        }
        if(r==0)dp1=dp;
        else dp2=dp;
        reverse(all(s));
        reverse(all(c));
    }
    vector<int> cum(n+1,0);
    rep(i,n){
        cum[i+1]=cum[i];
        if(s[i]=='_')cum[i+1]++;
    }
    reverse(all(dp2));
    DBG(dp1,dp2);
    vector<int> ans(n,0);
    vector<vector<int>> dp(n,vector<int>(m+1,0));
    dp[0][0]=1;
    rep(i,n-1){
        rep(j,m+1){
            if(!dp[i][j])continue;
            if(s[i+1]!='X'){
                dp[i+1][j]=1;
            }
            if(j==m)continue;
            if(i+c[j]+1<n&&s[i+c[j]+1]!='X'){
                if(cum[i+c[j]+1]-cum[i+1]==0){
                    dp[i+c[j]+1][j+1]=1;
                    if(dp2[i+c[j]+1][m-(j+1)]){
                        ans[i+1]++;
                        ans[i+c[j]+1]--;
                    }
                }
            }
        }
    }
    rep(i,n-1){
        ans[i+1]+=ans[i];
    }
    vector<int> white(n);
    rep(i,n){
        rep(j,m+1){
            if(dp1[i][j]&&dp2[i][m-j]){
                white[i]=1;
            }
        }
    }
    rep(i,n-2){
        if(ans[i+1]&&white[i+1]){
            fin[i]='?';
        }
        else if(ans[i+1]){
            fin[i]='X';
        }
        else{
            fin[i]='_';
        }
    }
    return fin;
}
#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...