Submission #390226

#TimeUsernameProblemLanguageResultExecution timeMemory
390226faresbasbsPaint By Numbers (IOI16_paint)C++14
90 / 100
2113 ms422964 KiB
#include <bits/stdc++.h>
#include "paint.h";
using namespace std;
int n,k,t,lst1,lst2,sum,arr[101],pref[200001],nxt_[200001],nxtX[200001],pre_[200001],preX[200001];
vector<int> segment[102][2];
string s;

int getval(int tag , int tag2 , int a , int b , int curr , int l , int r){
    if(b < l || a > r || b < a){
        return 0;
    }
    if(a <= l && b >= r){
        return segment[tag2][tag][curr];
    }
    int mid = (l+r)/2;
    return max(getval(tag,tag2,a,b,2*curr,l,mid),getval(tag,tag2,a,b,2*curr+1,mid+1,r));
}

void upd(int tag , int tag2 , int pos , int val){
    while(pos){
        segment[tag2][tag][pos] = max(segment[tag2][tag][pos],val);
        pos /= 2;
    }
}

string solve_puzzle(string s , vector<int> c){
    s = "###"+s+"##";
    k = c.size();
    n = s.size()-3;
    t = pow(2,ceil(log2(n+4)));
    for(int i = 0 ; i <= k+1 ; i += 1){
        segment[i][0].resize(2*t,0);
        segment[i][1].resize(2*t,0);
    }
    for(int i = 1 ; i <= n ; i += 1){
        if(s[i] == 'X'){
            break;
        }
        upd(0,0,i+t-1,1);
    }
    for(int i = n+2 ; i >= 1 ; i -= 1){
        if(s[i] == 'X'){
            break;
        }
        upd(1,k+1,i+t-1,1);
    }
    for(int i = 1 ; i <= k ; i += 1){
        arr[i] = c[i-1];
    }
    lst1 = n+2 , lst2 = n+1;
    for(int i = n+2 ; i >= 0 ; i -= 1){
        if(s[i] == 'X'){
            lst1 = i;
        }else if(s[i] == '_'){
            lst2 = i;
        }
        nxt_[i] = lst2 , nxtX[i] = lst1;
    }
    lst1 = 1 , lst2 = 2;
    for(int i = 0 ; i <= n+2 ; i += 1){
        if(s[i] == 'X'){
            lst1 = i;
        }else if(s[i] == '_'){
            lst2 = i;
        }
        pre_[i] = lst2 , preX[i] = lst1;
    }
    for(int i = n ; i >= 3 ; i -= 1){
        for(int j = k ; j >= 1 ; j -= 1){
            if(nxt_[i] < i+arr[j]){
                continue;
            }
            upd(1,j,i+t-1,getval(1,j+1,i+arr[j]+1,nxtX[i+arr[j]],1,1,t));
        }
    }
    for(int i = 3 ; i <= n ; i += 1){
        for(int j = 1 ; j <= k ; j += 1){
            if(pre_[i] > i-arr[j]){
                continue;
            }
            upd(0,j,i+t-1,getval(0,j-1,preX[i-arr[j]],i-arr[j]-1,1,1,t));
        }
    }
    string ans = "";
    for(int i = 3 ; i <= n ; i += 1){
        bool b = 0 , w = 0;
        for(int j = 1 ; j <= k+1 ; j += 1){
            if(s[i] != 'X' && getval(1,j,i+1,nxtX[i],1,1,t) && getval(0,j-1,preX[i],i-1,1,1,t)){
                w = 1;
            }
            if(j <= k && segment[j][1][i+t-1] && getval(0,j-1,preX[i-1],i-2,1,1,t)){
                pref[i] += 1 , pref[i+arr[j]] -= 1;
            }
        }
        sum += pref[i];
        b = (sum > 0 ? 1 : 0);
        if(b && w){
            ans += '?';
        }else if(b){
            ans += 'X';
        }else{
            ans += '_';
        }
    }
    return ans;
}

Compilation message (stderr)

paint.cpp:2:19: warning: extra tokens at end of #include directive
    2 | #include "paint.h";
      |                   ^
#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...