Submission #1354723

#TimeUsernameProblemLanguageResultExecution timeMemory
1354723lizi14Paint By Numbers (IOI16_paint)C++20
0 / 100
0 ms344 KiB
#include <bits/stdc++.h>
#include "paint.h"

using namespace std;

int pre[200005];
vector<vector<bool>> happy_lama(string bati, vector<int>c1){
    int n=bati.size();
    int m=c1.size();
    vector<vector<bool>>dp(n+1,vector<bool>(m+1));
    dp[0][0]=1;
    for(int i=1; i<=n; i++){
        for(int j=0; j<=m; j++){
            dp[i][j]=0;
            int hi=0;
            if(bati[i]!='X' && dp[i-1][j]==1){
                hi=1;
            }
            if(j!=0){
                //int a=0;
                int pa=-1;
                if(i-c1[j]+1>0){
                    pa=pre[i]-pre[i-c1[j]];
                }
                else{
                    pa=pre[i];
                }
                if(pa==-1 || pa>=1){
                    continue;
                }
                if(i<c1[j])continue;
                if(i>c1[j]){
                    if(bati[i-c1[j]]!='X'){
                        if(dp[i-c1[j]-1][j-1]==1){
                            hi=1;
                        }
                    }
                }
            }
            if(hi==1){
                dp[i][j]=1;
            }
        }
    }
    return dp;
}


string solve_puzzle(string s, vector<int> c) {
    string bati="*";
    bati+=s;
    vector<int>c1;
    c1.push_back(0);
    for(int i=0; i<c.size(); i++){
        c1.push_back(c[i]);
    }
    int n=bati.size();
    int m=c1.size();
    for(int i=1; i<=n; i++){
        if(bati[i]=='_'){
            pre[i]++;
        }
        pre[i]+=pre[i-1];
    }
    vector<vector<bool>>dp1=happy_lama(bati,c1);
    string a="*";
    reverse(s.begin(),s.end());
    a+=s;
    vector<int>b;
    b.push_back(0);
    reverse(c.begin(),c.end());
    for(int i=1; i<=c.size(); i++){
        b.push_back(c[i]);
    }
    vector<vector<bool>>dp2=happy_lama(a,b);
    // reverse(s.begin(),s.end());
    // reverse(c.begin(),c.end());
    vector<int>answ(n+1,0);
    /*
    _  0
    X  1
    ?  2
    */
    map<int,pair<int,int>>mp;
    for(int i=1; i<=n; i++){
        int hi=0;
        if(bati[i]=='_' || bati[i]=='X'){
            if(bati[i]=='_'){
                answ[i]=1;
            }
            continue;
        }
        for(int j=1; j<=m; j++){
            int ha=0;
            if(i==1)ha++;
            if(i>1 && dp1[i-1][j]==1){
                ha++;
            }
            if(i==n-1)ha++;
            if(i<n-1 && dp2[n-i-1][m-j]==1){
                ha++;
            }
            if(ha==2){
                answ[i]=1;
            }
            
            int ichini=0;
            if(i>2 && j>=1 && dp1[i-2][j-1]==1){
                if(bati[i]!='X')ichini++;
            }
            else if(i==2 && j==0){
                if(bati[i]!='X')ichini++;
            }
            else if(i<2 && j==0)ichini++;
            int h=i+j;
            if(h==n && j==m){
                ichini++;
            }
            else if(h==n-1 && j==m){
                if(bati[h]!='X')ichini++;
            }
            else{
                if(bati[h]!='X' && i<n-1 && m-j-1>0 && dp2[n-i-1][m-j-1]==1)ichini++;
            }
            if(ichini==2){
                mp[i].first++;
                mp[h+1].second++;
            }
        }
    }
    string ixvi="";
    int la=0;
    for(int i=1; i<=n; i++){
        if(bati[i]!='.'){
            ixvi+=bati[i];
            continue;
        }
        if(mp[i].first>0){
            la+=mp[i].first;
        }
        if(mp[i].second>0){
            la-=mp[i].second;
        }
        if(la==0){
            if(answ[i]==1){
                ixvi+='_';
            }
            else{
                ixvi+='?';
            }
        }
        else{
            if(answ[i]==1){
                ixvi+='?';
            }
            else{
                ixvi+='X';
            }
        }
    }
    return ixvi;
}
#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...