Submission #500943

#TimeUsernameProblemLanguageResultExecution timeMemory
500943aryan12Paint By Numbers (IOI16_paint)C++17
80 / 100
4 ms7372 KiB
#include "paint.h"
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 5e3 + 5, MAXK = 102;
long long canBlack[MAXN], canWhite[MAXN], dp[MAXN][MAXK];
string S;
vector<int> C;
vector<int> white;

long long recur(long long s_idx, long long c_idx) {
    if(s_idx == S.size() && c_idx == C.size()) { //works
        return dp[s_idx][c_idx] = 1;
    }
    if(s_idx >= S.size() || c_idx > C.size()) { //out of bounds
        return dp[s_idx][c_idx] = 0;
    }
    if(dp[s_idx][c_idx] != -1) {
        return dp[s_idx][c_idx];
    }
    dp[s_idx][c_idx] = 0;
    /*
    Conditions to make this block white:
    Current position shouldn't be black;

    Conditions to make the next Y blocks black:
    There shouldn't be a white block in between;
    The Y+1th block shouldn't be black
    The cur + Yth box should exist
    */

    //to make the block white
    if(S[s_idx] != 'X') {
        recur(s_idx + 1, c_idx);
        if(dp[s_idx + 1][c_idx] != 0) {
            canWhite[s_idx]++;
            canWhite[s_idx + 1]--;
            dp[s_idx][c_idx] += dp[s_idx + 1][c_idx];
        }
    }

    //to make the next Y blocks black
    int x = lower_bound(white.begin(), white.end(), s_idx) - white.begin();
    int f1 = 0;
    //so that cur + Y exists
    if(s_idx + C[c_idx] - 1 < S.size()) {
        f1++;
    } 
    //for white not in between
    if(x == white.size() || white[x] >= s_idx + C[c_idx]) {
        f1++;
    }
    //for Y+1 not black
    if(S[s_idx + C[c_idx]] != 'X') {
        f1++;
    }
    if(f1 == 3) { //all conditions satisfied
        recur(s_idx + C[c_idx] + 1, c_idx + 1);
        if(dp[s_idx + C[c_idx] + 1][c_idx + 1] != 0) {
            canBlack[s_idx]++;
            canBlack[s_idx + C[c_idx]]--;
            canWhite[s_idx + C[c_idx]]++;
            canWhite[s_idx + C[c_idx] + 1]--;
        } 
        dp[s_idx][c_idx] += dp[s_idx + C[c_idx] + 1][c_idx + 1];
    }
    return dp[s_idx][c_idx];
}

string solve_puzzle(string s, vector<int> c) {
    S = s;
    S += "_";
    for(int i = 0; i < s.size(); i++) {
        if(s[i] == '_') {
            white.push_back(i);
        }
    }
    for(int i = 0; i < c.size(); i++) {
        C.push_back(c[i]);
    }
    int n = s.size(), k = c.size();
    for(int i = 0; i <= n; i++) {
        for(int j = 0; j <= k; j++) {
            dp[i][j] = -1;
        }
    }
    long long ok = recur(0, 0);
    /*for(int i = 0; i < s.size(); i++) {
        for(int j = 0; j < c.size(); j++) {
            cout << dp[i][j] << " ";
        }
        cout << "\n";
    }*/
    string ans = "";
    for(int i = 1; i <= n; i++) {
        canWhite[i] += canWhite[i - 1];
        canBlack[i] += canBlack[i - 1];
    }
    for(int i = 0; i < n; i++) {
        if(canWhite[i] != 0 && canBlack[i] != 0) {
            ans += "?";
        }
        else if(canWhite[i] != 0 && canBlack[i] == 0) {
            ans += "_";
        }
        else {
            ans += "X";
        }
    }
    return ans;
    return "";
}

Compilation message (stderr)

paint.cpp: In function 'long long int recur(long long int, long long int)':
paint.cpp:12:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 |     if(s_idx == S.size() && c_idx == C.size()) { //works
      |        ~~~~~~^~~~~~~~~~~
paint.cpp:12:35: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 |     if(s_idx == S.size() && c_idx == C.size()) { //works
      |                             ~~~~~~^~~~~~~~~~~
paint.cpp:15:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   15 |     if(s_idx >= S.size() || c_idx > C.size()) { //out of bounds
      |        ~~~~~~^~~~~~~~~~~
paint.cpp:15:35: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   15 |     if(s_idx >= S.size() || c_idx > C.size()) { //out of bounds
      |                             ~~~~~~^~~~~~~~~~
paint.cpp:46:29: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |     if(s_idx + C[c_idx] - 1 < S.size()) {
      |        ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
paint.cpp:50:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |     if(x == white.size() || white[x] >= s_idx + C[c_idx]) {
      |        ~~^~~~~~~~~~~~~~~
paint.cpp: In function 'std::string solve_puzzle(std::string, std::vector<int>)':
paint.cpp:73:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |     for(int i = 0; i < s.size(); i++) {
      |                    ~~^~~~~~~~~~
paint.cpp:78:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |     for(int i = 0; i < c.size(); i++) {
      |                    ~~^~~~~~~~~~
paint.cpp:87:15: warning: unused variable 'ok' [-Wunused-variable]
   87 |     long long ok = recur(0, 0);
      |               ^~
#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...