Submission #917306

#TimeUsernameProblemLanguageResultExecution timeMemory
917306velislavgarkovPaint By Numbers (IOI16_paint)C++14
59 / 100
2 ms4700 KiB
#include "paint.h"
#include <iostream>
#include <vector>
using namespace std;
const int MAXN=2e5+10;
const int MAXK=1e2+10;
string s;
int c[MAXK];
int lef[MAXN], ri[MAXN], pr[MAXN][MAXK];
bool ok[2][MAXN][MAXK];
int n, k;
int get_gr(int ind, int i) {
    if (ind==0) return lef[i];
    return n-ri[n-i+1]+1;
}
void find_dp(int ind) {
    for (int i=0;i<=n+1;i++) {
        if (s[i]=='X') break;
        ok[ind][i][0]=true;
    }
    int cur;
    for (int i=1;i<=n+1;i++) {
        for (int j=1;j<=k;j++) {
            ok[ind][i][j]=false;
            if (s[i]=='X') continue;
            ok[ind][i][j]=ok[ind][i-1][j];
            if (i-c[j]-1<0) continue;
            cur=get_gr(ind,i-1);
            if (cur<=i-c[j]-1 && s[i-c[j]]!='X') {
                if (ok[ind][i-c[j]-1][j-1]) ok[ind][i][j]=true;
            }
        }
    }
}
string solve_puzzle(string S, vector <int> C) {
    n=S.size(); k=C.size();
    string ans=S;
    s='_'+S+'_';
    for (int i=1;i<=k;i++) c[i]=C[i-1];
    lef[0]=0; ri[n+1]=n+1;
    for (int i=1;i<=n;i++) {
        if (s[i]=='_') lef[i]=i;
        else lef[i]=lef[i-1];
    }
    for (int i=n;i>=1;i--) {
        if (s[i]=='_') ri[i]=i;
        else ri[i]=ri[i+1];
    }
    find_dp(0);
    for (int i=1;i<=n/2;i++) swap(s[i],s[n-i+1]);
    for (int i=1;i<=k/2;i++) swap(c[i],c[k-i+1]);
    find_dp(1);
    for (int i=0;i<=n/2;i++) {
        swap(s[i],s[n+1-i]);
        for (int j=0;j<=k;j++) swap(ok[1][i][j],ok[1][n+1-i][j]);
    }
    for (int i=1;i<=k/2;i++) swap(c[i],c[k-i+1]);
    for (int i=1;i<=n+1;i++) {
        for (int j=0;j<=k;j++) {
            bool cur;
            cur=(ok[0][i][j]&ok[1][i][k-j]);
            if (j>0) {
                if (i-c[j]-1<0) cur=false;
                else cur&=ok[0][i-c[j]-1][j-1];
            }
            pr[i][j]=pr[i-1][j]+cur;
        }
    }
    for (int i=1;i<=n;i++) {
        if (s[i]!='.') continue;
        bool okb, okw;
        okb=okw=false;
        for (int j=0;j<=k;j++) {
            if (ok[0][i][j] && ok[1][i][k-j]) okw=true;
            if (j==0) continue;
            if (ri[i]-lef[i]-1<c[j]) continue;
            int l, r;
            r=min(ri[i],i+c[j]);
            l=max(i+1,lef[i]+c[j]+1);
            if (pr[r][j]-pr[l-1][j]>0) okb=true;
        }
        if (okb && okw) ans[i-1]='?';
        else if (okb) ans[i-1]='X';
        else ans[i-1]='_';
    }
    return ans;
}

/*int main () {
    cout << solve_puzzle("..................", {9}) << endl;
}*/
#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...