Submission #1306703

#TimeUsernameProblemLanguageResultExecution timeMemory
1306703enzyPaint By Numbers (IOI16_paint)C++20
100 / 100
470 ms176080 KiB
#include "paint.h"
#include <bits/stdc++.h>
using namespace std;
#define sz(v) (int)(v.size())
const int maxn=2e5+10;
const int maxk=110;
int dpl[maxn][maxk], dpr[maxn][maxk], sp[maxn], v[maxn], tam[maxk], white[maxn], black[maxn];
int sum(int l, int r){
    if(l>r) swap(l,r);
    return sp[r]-sp[l-1];
}
void calc(int n, int k){
    memset(dpl,0,sizeof(dpl)); memset(dpl,0,sizeof(dpr));
    dpl[0][0]=1; // no 0 pego 0 caras
    for(int i=0;i<n;i++){
        for(int j=0;j<=k;j++){ // ja coloquei j caras
            if(!v[i+1]) dpl[i+1][j]|=dpl[i][j]; // posso deixar branco
            if(j!=k&&i+tam[j+1]<=n&&sum(i+1,i+tam[j+1])==0&&v[i+tam[j+1]+1]==0) dpl[i+tam[j+1]+1][j+1]|=dpl[i][j];
        }
    }
    dpr[n+1][k+1]=1;
    for(int i=n+1;i>1;i--){
        for(int j=k+1;j>=1;j--){
            if(!v[i-1]) dpr[i-1][j]|=dpr[i][j];
            if(j!=1&&i-tam[j-1]>=1&&sum(i-tam[j-1],i-1)==0&&v[i-tam[j-1]-1]==0) dpr[i-tam[j-1]-1][j-1]|=dpr[i][j];
        }
    }
}
string solve_puzzle(string s, vector<int> c){
    int n=s.size(), k=c.size();
    s='a'+s; // 1 indexed
    for(int i=1;i<=k;i++) tam[i]=c[i-1];
    for(int i=1;i<=n;i++){
        sp[i]=sp[i-1];
        if(s[i]=='X') v[i]=1;
        if(s[i]=='_') sp[i]++;
    }
    calc(n,k);
    memset(white,0,sizeof(white)); memset(black,0,sizeof(black));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=k+1;j++) if(dpl[i][j-1]&&dpr[i][j]) white[i]++; // checando se pode ser branco
    }
    for(int j=1;j<=k;j++){
        for(int i=1;i+tam[j]-1<=n;i++){
            // vou brutar se o j-esimo intervalo estiver em [i,i+tam[j]-1], ainda eh possivel completar o resto?
            if(sum(i,i+tam[j]-1)==0&&dpl[i-1][j-1]&&dpr[i+tam[j]][j+1]) black[i]++, black[i+tam[j]]--;
        }
    }
    string ret="";
    int sum=0;
    for(int i=1;i<=n;i++){
        sum+=black[i];
        if(s[i]!='.') ret.push_back(s[i]);
        else{
            if(sum&&white[i]) ret.push_back('?');
            else if(sum) ret.push_back('X');
            else ret.push_back('_');
        }
    }
    return ret;
}

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...