Submission #1197486

#TimeUsernameProblemLanguageResultExecution timeMemory
1197486jokerPaint By Numbers (IOI16_paint)C++20
59 / 100
1 ms328 KiB
#include "paint.h"
#include<bits/stdc++.h>
using namespace std;


int lwb (vector<int> &whts,int i) {
    int l = 0;
    int r = whts.size()-1;
    int ans = 0;
    while (l <= r) {
        int mid = l + (r-l)/2;
        if (whts[mid] == i) {
            return mid;
        } else if (whts[mid] > i) {
            r = mid - 1;
        } else {
            ans = mid;
            l = mid + 1;
        }
    }
    return ans;
}

string solve_puzzle(string s, vector<int> c) {
    string t;
    int n = s.size();
    for (int i = 0; i < n; i++) {
        t += '_';
        // if (s[i] == '_') t[i] = s[i];
    }
    int k = c.size();
    vector<int> whts = {-1};
    for (int i = 0; i < n; i++) {
        if (s[i] == '_') whts.push_back(i);
    }
    whts.push_back(n);

    vector<int> prf(k);
    vector<int> suff(k);
    int iprf = 0;
    int lk = 0;
    while (iprf < n && lk < k) {
        int lb = lower_bound(whts.begin(),whts.end(), iprf) - whts.begin();
        if (whts[lb]-iprf < c[lk]) {
            iprf = whts[lb]+1;
            continue;
        }
        prf[lk] = iprf;
        iprf += c[lk]+1;
        lk++;
    }

    lk = k-1;
    iprf = n-1;
    while (lk >= 0 && iprf >= 0) {
        int lb = lwb(whts, iprf);
        if (iprf-whts[lb] < c[lk]) {
            iprf = whts[lb]-1;
            continue;
        }
        suff[lk] = iprf;
        iprf -= c[lk]+1;
        lk--;
    }

    for (int i = 0; i < k; i++) {
        pair<int,int> intrvl = make_pair(prf[i],suff[i]);
        vector<pair<int,int>> sgmnt;
        int str = intrvl.first;

        for (int j = intrvl.first; j <= intrvl.second; j++) {
            if (s[j] == '_') {
                if (j-str >= c[i]) sgmnt.push_back({str, j - 1});
                str = j + 1;
            }
        }
        if (intrvl.second-str+1 >= c[i]) sgmnt.push_back({str,intrvl.second});
        for (auto pr:sgmnt) {
            if (sgmnt.size() > 1) {
                for (int j = pr.first; j <= pr.second; j++) {
                    t[j] = '?';
                }
            } else {
                int extr = pr.second-pr.first+1-c[i];
                for (int j = pr.first; j <= pr.second; j++) {
                    if ((j-pr.first+1) <= extr || (pr.second-j+1) <= extr) t[j] = '?';
                    else t[j] = 'X';
                }
            }
        }
    }

    // for (int i = 0; i < n; i++) {
    //     if (t[i] != '?' && t[i] != '_') t[i] = 'X';
    // }
    return t;
}

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