Submission #618899

#TimeUsernameProblemLanguageResultExecution timeMemory
618899Dremix10Paint By Numbers (IOI16_paint)C++17
80 / 100
2 ms1236 KiB
#include "paint.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
typedef pair<ll,ll> pl;
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define F first
#define S second
#ifdef dremix
    #define p(x) cerr<<#x<<" = "<<x<<endl;
    #define p2(x,y) cerr<<#x<<" , "<<#y<<" = "<<x<<" , "<<y<<endl;
    #define pp(x) cerr<<#x<<" = "<<x.F<<"-"<<x.S<<endl;
    #define pv(x) cerr<<#x<<" = {";for(auto v : x)cerr<<v<<", ";cerr<<"}"<<endl;
    #define ppv(x) cerr<<#x<<" = {";for(auto v : x)cerr<<v.F<<"-"<<v.S<<", ";cerr<<"}"<<endl;
#else
    #define p(x) {}
    #define p2(x,y) {}
    #define pp(x) {}
    #define pv(x) {}
    #define ppv(x) {}
#endif
const int N = 105;
const int MOD = 1e9+7;
const ll INF = 1e18+5;


vector<vector<bool> > v;
vector<int> c,arr;
string s;
vector<int> prefw;

bool dp[N][N][N];
bool vis[N][N][N];

int cnt(int l, int r){
    if(l == 0)return prefw[r];
    return prefw[r] - prefw[l-1];
}

bool solve(int i, int j, int rem){
    p2(i,j)
    if(i == arr.size()){
        assert(j == c.size() && rem == 0);
        return true;
    }
    if(vis[i][j][rem])return dp[i][j][rem];
    bool res = false;

    if(arr[i] == 2 || arr[i] == 1){
        if(j < c.size()){
            bool ok = true;

            if(cnt(i,i+c[j]-1) > 0)
                ok = false;
            
            if(arr[i+c[j]] == 1)
                ok = false;

            bool add = j + 1 < c.size();

            bool p = false;
            if(ok)
                p = solve(i+c[j]+add,j+1,rem);

            if(p){
                for(int k=0;k<c[j];k++)
                    v[i+k][1] = true;
                if(add)
                    v[i+c[j]][0] = true;
            }
            res |= p;
        }
    }

    if(arr[i] == 2 || arr[i] == 0){
        if(rem > 0){
            bool p = solve(i+1,j,rem-1);
            if(p){
                v[i][0] = true;
            }
            res |= p;
        }
    }
    dp[i][j][rem] = res;
    vis[i][j][rem] = true;
    return res;
}

std::string solve_puzzle(std::string S, std::vector<int> C) {
    s = S;
    c = C;

    int n = s.size();
    int m = c.size();

    arr.resize(n);

    int i,j;

    for(i=0;i<n;i++){
        if(s[i] == '_')
            arr[i] = 0;
        else if(s[i] == 'X')
            arr[i] = 1;
        else{
            assert(s[i] == '.');
            arr[i] = 2;
        }
    }

    prefw.resize(n);
    prefw[0] = arr[0] == 0;
    for(i=1;i<n;i++){
        prefw[i] = prefw[i-1] + (arr[i] == 0);
    }
    pv(arr)
    pv(prefw)

    int sum = 0;

    for(auto x : c)
        sum += x;

    int gaps = n - sum;

    assert(gaps >= m-1);

    gaps -= m-1;

    // there are (gaps + m) choose (m) ways to put the gaps

    //rem = gaps;
    v.assign(n,vector<bool>(2,false));

    assert(solve(0,0,gaps));

    string ans = "";

    for(i=0;i<n;i++){
        p(i)
        p2(v[i][0],v[i][1])
        if(v[i][0] == v[i][1]){

            assert(v[i][0] != false);
            ans += '?';
        }
        else if(v[i][0]){
            ans += '_';
        }
        else{
            ans += 'X';
        }
    }
    return ans;
}

Compilation message (stderr)

paint.cpp: In function 'bool solve(int, int, int)':
paint.cpp:44:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |     if(i == arr.size()){
      |        ~~^~~~~~~~~~~~~
In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from paint.cpp:2:
paint.cpp:45:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |         assert(j == c.size() && rem == 0);
      |                ~~^~~~~~~~~~~
paint.cpp:52:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |         if(j < c.size()){
      |            ~~^~~~~~~~~~
paint.cpp:61:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   61 |             bool add = j + 1 < c.size();
      |                        ~~~~~~^~~~~~~~~~
paint.cpp: In function 'std::string solve_puzzle(std::string, std::vector<int>)':
paint.cpp:100:11: warning: unused variable 'j' [-Wunused-variable]
  100 |     int i,j;
      |           ^
#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...