Submission #1312610

#TimeUsernameProblemLanguageResultExecution timeMemory
1312610settopPaint By Numbers (IOI16_paint)C++20
100 / 100
341 ms348028 KiB
#include "paint.h"
#include<bits/stdc++.h>

using namespace std;
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

#define ll long long
#define ordered_set tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back
#define sz(x) (int)x.size()

std::string solve_puzzle(std::string s, std::vector<int> c) {
    int n=sz(s),k=sz(c);
    
    vector<vector<int>> dp(n+1,vector<int>(k+1)),dp2(n+1,vector<int>(k+1)),z(n+1,vector<int>(k+1)),z2(n+1,vector<int>(k+1));
    vector<int> pref(n+1),cank(n+2),canp(n+2); 
    
    pref[0]=0;

    fall(i,1,n){
        pref[i]=pref[i-1];
        if(s[i-1]=='_') pref[i]=i;
    }


    dp2[0][0]=1;

    fall(i,1,n){ //índice do cara e o número de blocos "fechados" que temos até o momento
        fall(j,0,k){
            dp2[i][j]=dp2[i-1][j];
            if(j!=0) dp2[i][j]|=dp[i-1][j-1];
            if(s[i-1]=='X') dp2[i][j]=0;

            if(j!=k && pref[i]<=i-c[j]) dp[i][j]=dp2[i-c[j]][j];
        }
    }

    z[n][k-1]=dp[n][k-1];
    z2[n][k]=dp2[n][k];

    rfall(i,n,1){
        fall(j,0,k){
            if(dp[i][j] && z[i][j]==1){
                cank[i-c[j]+1]++;
                cank[i+1]--;
                z2[i-c[j]][j]=1;
            }
            if(dp2[i][j] && z2[i][j]){
                canp[i]=1;
                z2[i-1][j]=1;
                if(j) z[i-1][j-1]=1;
            }
        }
    }

    string ans="";
    fall(i,1,n){
        cank[i]+=cank[i-1];
        if(cank[i] && canp[i]) ans+="?";
        else if(cank[i]) ans+="X";
        else ans+="_";
    }

    return ans;
}

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