Submission #57074

#TimeUsernameProblemLanguageResultExecution timeMemory
57074alenam0161Paint By Numbers (IOI16_paint)C++17
100 / 100
604 ms129840 KiB
    #include "paint.h"
    #include <cstdlib>
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 300007;
    const int K = 307;
    bool suf[N][K];
    bool pre[N][K];
    int gum[N];
    int vl[N];
    int g[N];
    std::string solve_puzzle(std::string s, std::vector<int> c) {
        int n=s.length();
        int k=c.size();
        for(int i=0;i<n;++i){
            if(i)gum[i]+=gum[i-1];
            gum[i]+=(s[i]=='_');
        }
        auto sum=[&](int l,int r){
            return gum[r]-(l==0 ? 0:gum[l-1]);
        };
        suf[n][k]=true;
        suf[n+1][k]=true;
        for(int i=n-1;i>=0;i--){
            for(int j=k;j>=0;--j){
                if(s[i]!='X'&&suf[i+1][j])suf[i][j]=true;
                if(j==k)continue;
                if(c[j]+i-1<n&&sum(i,i+c[j]-1)==0){
                    if(i+c[j]<n&&s[i+c[j]]=='X')continue;
                    if(suf[i+c[j]+1][j+1]==false)continue;
                    suf[i][j]=true;
                }
            }
        }
        for(int i=0;i<n;++i){
            for(int j=-1;j<k;++j){
                int z=(i==0&&j==-1);
                if(s[i]!='X'&&z)pre[0][0]=true;
                if(s[i]!='X'&&z==false&&pre[i-1][j+1]==true)pre[i][j+1]=true;
                if(j==-1)continue;
                if(i-c[j]+1>=0&&sum(i-c[j]+1,i)==0){
                    if(i-c[j]>=0&&s[i-c[j]]=='X')continue;
                    if(i-c[j]-1<0&&j!=0)continue;
                    if(i-c[j]-1>=0&&pre[i-c[j]-1][j]==false)continue;
                    pre[i][j+1]=true;
                }
            }
        }
        for(int i=0;i<n;++i){
            for(int j=-1;j<k;++j){
                if(s[i]!='.')continue;
                bool okl=false;
                bool okr=false;
                if(suf[i+1][j+1]==true)okr=true;
                okl=(i==0&&j==-1)||(!(i==0&&j==-1)&&pre[i-1][j+1]);
                if(okr&&okl)vl[i]|=1;
            }
        }
        for(int i=0;i<n;++i){
            for(int j=0;j<k;++j){
                if(s[i]=='_')continue;
                bool ok=false;
                if(c[j]+i-1<n){
                    bool x=true;
                    if(i>0){
                        if(s[i-1]=='X')x=false;
                        else if(i-2>=0){
                        if(pre[i-2][j]==false){
                            x=false;
                        }
                        }
                        else if(j!=0)x=false;
                    }
                    else if(j!=0)x=false;
                    if(x==false)continue;
                    if(c[j]+i==n){
                        if(pre[c[j]+i-1][j+1]==true&&j==k-1&&sum(i,c[j]+i-1)==0)
                            g[i]=max(g[i],c[j]);
                    }
                    else
                    if(pre[c[j]+i-1][j+1]==true&&suf[c[j]+i+1][j+1]==true&&s[c[j]+i]!='X'&&sum(i,c[j]+i-1)==0){
                        g[i]=max(g[i],c[j]);
                    }
                }
            }
        }

        for(int i=0;i<n;++i){
            if(g[i]>0)vl[i]|=2;
            g[i+1]=max(g[i+1],g[i]-1);
        }
        for(int i=0;i<n;++i){
            if(s[i]=='.'){
                if(vl[i]==0)assert(0);
                if(vl[i]==1)s[i]='_';
                if(vl[i]==2)s[i]='X';
                if(vl[i]==3)s[i]='?';
            }
        }
        return s;
    }

Compilation message (stderr)

paint.cpp: In function 'std::__cxx11::string solve_puzzle(std::__cxx11::string, std::vector<int>)':
paint.cpp:62:22: warning: unused variable 'ok' [-Wunused-variable]
                 bool ok=false;
                      ^~
#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...