Submission #1168131

#TimeUsernameProblemLanguageResultExecution timeMemory
1168131SmuggingSpunPaint By Numbers (IOI16_paint)C++20
90 / 100
2095 ms27776 KiB
#include<bits/stdc++.h>
#include "paint.h"
using namespace std;
string solve_puzzle(string s, vector<int>c) {
    int n = s.size();
    if(n <= 20 && false){
        for(char& c : s){
            if(c != '.'){
                c = (c == 'X' ? '1' : '0');
            }
        }
        vector<int>ans(n, 0);
        for(int mask = (1 << n) - 1; mask > -1; mask--){
            string cur = "";
            vector<int>C;
            bool flag = true;
            for(int i = 0; i < n; i++){
                cur += char((mask >> i & 1) + 48);
                if(s[i] != '.' && cur.back() != s[i]){
                    flag = false;
                    break;
                }
            }
            if(flag){
                cur += '0';
                for(int i = 0, cnt = 0; i <= n; i++){
                    if(cur[i] == '0' && cnt > 0){
                        C.emplace_back(cnt);
                        cnt = 0;
                    }
                    else if(cur[i] == '1'){
                        cnt++;
                    }
                }
                if(C == c){ 
                    for(int i = 0; i < n; i++){
                        ans[i] |= 1 << (cur[i] - 48);
                    }
                }
            }
        }
        string ret = "";
        for(int i = 0; i < n; i++){
            ret += (ans[i] == 1 ? '_' : (ans[i] == 2 ? 'X' : '?'));
        }
        return ret;
    }
    string ans = "";
    if(s == string(n, '.') && false){
        for(int i = 0; i < n; i++){
            int p = -1, left = i, right;
            if(left >= c[0]){
                for(int j = 0; j < c.size(); left -= c[j++] + 1){
                    if(j + 1 == c.size() || left - c[j] <= c[j + 1]){
                        p = j;
                        break;
                    }
                }
            }
            if(accumulate(c.begin() + p + 1, c.end(), 0) + int(c.size()) - p - 1 > n - i){
                ans += 'X';
            }
            else{
                bool flag = false;
                for(int j = left = 0; !flag && j < c.size() && left <= i; j++, left++){
                    for(int k = 0; !flag && k < c[j] && left++ <= i; k++){
                        right = c[j] - k - 1;
                        for(int t = j + 1; t < c.size(); t++){
                            right += c[t] + 1;
                        }
                        if(right < n - i){
                            flag = true;
                        }
                    }
                }
                ans += (flag ? '?' : '_');
            }
        }
        return ans;
    }
    if(n <= 100 && false){
        vector<bool>flag(2);
        auto work = [&] (bool id){
            vector<int>fbl(n);
            fbl[0] = int(s[0] == '_');
            for(int i = 1; i < n; i++){
                fbl[i] = fbl[i - 1] + int(s[i] == '_');
            }            
            vector<bool>dp(n + 2, false);
            dp[n] = true;
            for(int i = n - 1; i > -1 && s[i] != 'X'; i--){
                dp[i] = true;
            }
            for(int i = int(c.size()) - 1; i > -1; i--){
                vector<bool>ndp(n + 2, false);
                for(int j = n - c[i]; j > -1; j--){
                    ndp[j] = ((s[j] != 'X' && ndp[j + 1]) || (fbl[j + c[i] - 1] == (j == 0 ? 0 : fbl[j - 1]) && ((i + 1 == c.size() && dp[j + c[i]]) || (i + 1 < c.size() && j + c[i] < n && s[j + c[i]] != 'X' && dp[j + c[i] + 1]))));
                }                
                swap(dp, ndp);
            }
            flag[id] = dp[0];
        };
        for(int i = 0; i < n; i++){
            if(s[i] != '.'){
                ans += s[i];
                continue;
            }
            s[i] = 'X';
            work(false);
            s[i] = '_';            
            work(true);
            s[i] = '.';
            ans += (flag[0] && flag[1] ? '?' : (flag[0] ? 'X' : '_'));
        }
        return ans;
    }
    int k = c.size();
    c.insert(c.begin(), -1);
    s = '#' + s + '#';
    vector<vector<bool>>pref(n + 1, vector<bool>(k + 1, false)), suf(n + 2, vector<bool>(k + 2, false));
    vector<int>lbl(n + 1), rbl(n + 2);
    pref[lbl[0] = 0][0] = suf[rbl[n + 1] = n + 1][k + 1] = true;
    for(int i = 1; i <= n; i++){
        pref[i][0] = (pref[i - 1][0] && s[i] != 'X');
        pref[i][1] = (((i - c[1] >= (lbl[i] = (s[i] == '_' ? i : lbl[i - 1]))) && pref[i - c[1]][0]) || (s[i] != 'X' && pref[i - 1][1]));
        for(int j = 2; j <= k; j++){
            pref[i][j] = ((pref[i - 1][j] && s[i] != 'X') || (i - c[j] >= max(1, lbl[i]) && s[i - c[j]] != 'X' && pref[i - c[j] - 1][j - 1] && s[i] != '_'));
        }
    }
    for(int i = n; i > 0; i--){
        suf[i][k + 1] = (suf[i + 1][k + 1] && s[i] != 'X');
        suf[i][k] = ((i + c[k] <= (rbl[i] = (s[i] == '_' ? i : rbl[i + 1])) && suf[i + c[k]][k + 1]) || (s[i] != 'X' && suf[i + 1][k]));
        for(int j = k - 1; j > 0; j--){
            suf[i][j] = ((suf[i + 1][j] && s[i] != 'X') || (i + c[j] <= min(n, rbl[i]) && s[ i + c[j]] != 'X' && suf[i + c[j] + 1][j + 1] && s[i] != '_'));
        }
    }
    for(int i = 1; i <= n; i++){
        if(s[i] != '.'){
            ans += s[i];
            continue;
        }
        bool flag = false;
        for(int j = 1; j <= k && !flag; j++){
            for(int mid = 1; mid <= c[j]; mid++){
                int left = i - mid - int(j > 1), right = i + c[j] - mid + 1 + int(j < k);
                if(i - mid >= lbl[i] && i + c[j] - mid < rbl[i] && left > -1 && s[left + int(j > 1)] != 'X' && pref[left][j - 1] && right < n + 2 && s[right - int(j < k)] != 'X' && suf[right][j + 1]){
                    flag = true;
                    break;
                }
            }
        }        
        if(!flag){
            ans += '_';
        }
        else{
            flag = false;
            for(int j = 0; j <= k; j++){
                if(pref[i - 1][j] && suf[i + 1][j + 1]){
                    flag = true;
                    break;
                }
            }
            ans += (flag ? '?' : 'X');
        }
    }
    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...