Submission #1359184

#TimeUsernameProblemLanguageResultExecution timeMemory
1359184LudisseyPaint By Numbers (IOI16_paint)C++20
100 / 100
747 ms292580 KiB
#include "paint.h"
#include <bits/stdc++.h>
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
using namespace std;
string s; 


std::string solve_puzzle(std::string _s, std::vector<int> c) {
    swap(s,_s);
    int n=sz(s);
    int k=sz(c);
    vector<bool> black(n,false);
    vector<bool> white(n,false);
    vector<int> pref(n,0);
    for (int i = 0; i < n; i++)
    {
        if(s[i]=='_') white[i]=true, pref[i]++;
        else if(s[i]=='X') black[i]=true;
        if(i>0) pref[i]+=pref[i-1];
    }
    vector<vector<bool>> dp(n,vector<bool>(k+1,false));
    vector<vector<bool>> dp2(n,vector<bool>(k+1,false));

    for (int _ = 0; _ < 2; _++)
    {
        if(s[0]!='X') dp[0][0]=true;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j <= k; j++)
            {
                if(i>0&&s[i]!='X') dp[i][j]=dp[i-1][j]|dp[i][j];
                int sm=pref[i];
                if(j>0&&i-c[j-1]>=0) sm-=pref[i-c[j-1]];
                if(j>0&&i>c[j-1]&&s[i-c[j-1]]!='X'&&sm==0) dp[i][j]=(dp[i-c[j-1]-1][j-1])|dp[i][j];
                if(j==1&&i==c[j-1]&&sm==0&&s[i-c[j-1]]!='X') dp[i][j]=true;
                if(j==1&&i+1==c[j-1]&&sm==0) dp[i][j]=true;
            }
        }
        swap(dp,dp2);
        reverse(all(s));
        reverse(all(c));
        for (int i = 0; i < n; i++)
        {
            if(s[i]=='_') pref[i]=1;
            else pref[i]=0;
            if(i>0) pref[i]+=pref[i-1];
        }
    }
    for (int i = 0; i < n; i++) reverse(all(dp2[i]));
    reverse(all(dp2));
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j <= k; j++)
        {
            bool lft=((i==0&&j==0)||(i>0&&dp[i-1][j]));
            bool rgt=((i==n-1&&j==k)||(i<n-1&&dp2[i+1][j]));
            if(lft&&rgt&&s[i]!='X') white[i]=true;
        }
    }
    /*for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < k; j++)                                                                                                     
        {
            for (int l = i-c[j]+1; l <= i; l++)
            {
                int r=l+c[j]-1;
                if(l<0||r>=n) continue;
                bool lft=((l==0&&j==0)||(((l==1&&j==0)||(l>1&&dp[l-2][j]))&&s[l-1]!='X'));
                bool rgt=((r==n-1&&j==k-1)||(((r==n-2&&j==k-1)||(r<n-2&&dp2[r+2][j+1]))&&s[r+1]!='X'));
                int sm=pref[r];
                if(l>0) sm-=pref[l-1];
                if(lft&&rgt&&sm==0) black[i]=true;
            }
        }
    }*/
    vector<pair<int,int>> blck;    
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < k; j++)                                                                                                     
        {
            int l=i;
            int r=l+c[j]-1;
            if(l<0||r>=n) continue;
            bool lft=((l==0&&j==0)||(((l==1&&j==0)||(l>1&&dp[l-2][j]))&&s[l-1]!='X'));
            bool rgt=((r==n-1&&j==k-1)||(((r==n-2&&j==k-1)||(r<n-2&&dp2[r+2][j+1]))&&s[r+1]!='X'));
            int sm=pref[r];
            if(l>0) sm-=pref[l-1];
            if(lft&&rgt&&sm==0) blck.push_back({l,r});
        }
    }
    sort(all(blck));
    int mx=-1;
    int _i=0;
    for (int i = 0; i < n; i++)
    {
        while(_i<sz(blck)&&blck[_i].first==i){
            mx=max(mx, blck[_i].second);
            _i++;
        }
        if(mx>=i) black[i]=true;
    }
    string out(n,'*');
    for (int i = 0; i < n; i++)
    {
        if(white[i]&&black[i]) out[i]='?';
        else if(white[i]) out[i]='_';
        else if(black[i]) out[i]='X';
    }
    return out;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...