Submission #1289922

#TimeUsernameProblemLanguageResultExecution timeMemory
1289922RaresPaint By Numbers (IOI16_paint)C++20
59 / 100
1 ms584 KiB
#include <bits/stdc++.h>
using namespace std;
#include "paint.h"
/**ifstream fin ("date.in");
ofstream fout ("date.out");
#define cin fin
#define cout fout**/

const int MAXK=205;
const int MAXN=200010;

int dp[MAXK][MAXN],n,k,fr[2][MAXN],a[MAXN];
int mars[MAXN];
string rez;

string solve_puzzle (string s, vector <int> c){
    n=s.size ();
    k=c.size ();

    for (int i=0;i<n;++i){
        if (s[i]=='.') a[i+1]=2;
        if (s[i]=='_') a[i+1]=1;
        if (s[i]=='X') a[i+1]=0;
    }
    fr[0][n+1]=fr[1][n+1]=n+1;
    for (int i=n;i>=1;--i){
        fr[0][i]=fr[0][i+1];
        fr[1][i]=fr[1][i+1];
        if (a[i]<2) fr[a[i]][i]=i;
    }
    a[n+1]=2;
    a[0]=2;

    int fp=1,nfp;
    for (int i=0;i<k;++i){
        nfp=n+1;
        for (int j=fp;j<=n-c[i]+1;++j){
            ///pot pune blocul i pe pozitia j?
            if (a[j-1]==0) break;
            if (fr[1][j]<=j+c[i]-1) continue;
            if (a[j+c[i]]==0) continue;
            dp[i][j]=1;
            nfp=min (nfp,j+c[i]+1);

        }
        fp=nfp;
    }

    fp=n;

    for (int i=k-1;i>=0;--i){
        nfp=0;
        for (int j=fp;j>=1;--j){
            if (i==k-1 and fr[0][j]!=n+1 and fr[0][j]>=j+c[i]) break;
            if (dp[i][j]==1){
                if (i)
                    nfp=max (nfp,j-1-c[i-1]);
                dp[i][j]=2;
            }
        }

        fp=nfp;
    }
    for (int i=0;i<n;++i){
        if (s[i]=='.') rez.push_back ('?');
        else rez.push_back (s[i]);
    }
    for (int i=0;i<=k-1;++i){
        int l=n+1,r=0;
        for (int j=1;j<=n;++j){
            if (dp[i][j]==2){
                l=min (l,j);
                r=max (r,j);
                mars[j]++;
                mars[j+c[i]]--;
            }
        }

        for (int j=r;j<=l+c[i]-1;++j){
            rez[j-1]='X';
        }
    }

    for (int i=1;i<=n;++i){
        mars[i]+=mars[i-1];
        if (mars[i]==0) rez[i-1]='_';
    }


    return rez;
}

/**int main()
{
    string s;
    cin >>s;
    vector <int> c;
    int x;
    while (fin >>x){
        c.push_back (x);
    }
    cout <<solve_puzzle (s,c);
    return 0;
}**/

Compilation message (stderr)

paint.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
paint_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...