제출 #1238859

#제출 시각아이디문제언어결과실행 시간메모리
1238859ereringPaint By Numbers (IOI16_paint)C++20
100 / 100
942 ms493912 KiB
#include <bits/stdc++.h>
#include "paint.h"
using namespace std;
const int MAXN=2e5+5,MAXK=100+5;
#define pb push_back
int prefw[MAXN],prefb[MAXN],prelast[MAXN][MAXK],sufflast[MAXN][MAXK],last[MAXN][MAXK];
deque<int> prepos[MAXK],suffpos[MAXK];
vector<int> pos[MAXK];
std::string solve_puzzle(string s, vector<int> c) {
    for(int i=0;i<MAXN;i++){
        for(int j=0;j<MAXK;j++){
            prelast[i][j]=-1;
            sufflast[i][j]=-1;
            last[i][j]=2e9;
        }
    }
    for(int i=0;i<s.size();i++){
        if(s[i]=='X')prefb[i]++;
        if(s[i]=='_')prefw[i]++;
        if(i>0){
            prefw[i]+=prefw[i-1];
            prefb[i]+=prefb[i-1];
        }
    }
    for(int i=0;i<s.size();i++){
        for(int j=0;j<c.size();j++){
            if(i>0)prelast[i][j]=prelast[i-1][j];
            if(c[j]>i+1)continue;
            int w=prefw[i]-(i-c[j]>=0?prefw[i-c[j]]:0);
            if(w>0)continue;
            if(j==0 && (i-c[j]<0 || prefb[i-c[j]]==0)){
                prepos[j].pb(i);
                prelast[i][j]=i;
                continue;
            }
            if(j==0)continue;
            if(prepos[j-1].empty() || i-c[j]-1<0)continue;
            int it=prelast[i-c[j]-1][j-1];
            if(it==-1)continue;
            int b=prefb[i-c[j]]-prefb[it];
            if(b>0)continue;
            prepos[j].pb(i);
            prelast[i][j]=i;
        }
    }

    for(int i=s.size()-1;i>=0;i--){
        for(int j=c.size()-1;j>=0;j--){
            sufflast[i][j]=sufflast[i+1][j];
            if(c[j]>s.size()-i)continue;
            int w=prefw[i+c[j]-1]-(i>0?prefw[i-1]:0);
            if(w>0)continue;
            if(j==c.size()-1 && prefb[s.size()-1]-prefb[i+c[j]-1]==0){
                suffpos[j].push_front(i);
                sufflast[i][j]=i;
                continue;
            }
            if(suffpos[j+1].empty())continue;
            int it=sufflast[i+c[j]+1][j+1];
            if(it==-1)continue;
            int b=prefb[it-1]-prefb[i+c[j]-1];
            if(b>0)continue;
            suffpos[j].push_front(i);
            sufflast[i][j]=i;
        }
    }

    for(int i=0;i<c.size();i++){
        for(int j=0;j<prepos[i].size();j++){
            if(i==c.size()-1 && prefb[s.size()-1]-prefb[prepos[i][j]]==0){
                pos[i].pb(prepos[i][j]);
                last[prepos[i][j]][i]=prepos[i][j];
                continue;
            }
            if(i==c.size()-1)continue;
            if(prepos[i][j]==s.size()-1 || s[prepos[i][j]+1]=='X')continue;
            int it=sufflast[prepos[i][j]+2][i+1];
            if(it==-1)continue;
            int b=prefb[it-1]-prefb[prepos[i][j]];
            if(b>0)continue;
            last[prepos[i][j]][i]=prepos[i][j];
            pos[i].pb(prepos[i][j]);
        }
    }
    for(int i=s.size()-2;i>=0;i--){
        for(int j=0;j<c.size();j++)last[i][j]=min(last[i][j],last[i+1][j]);
    }
    string ans;
    for(int i=0;i<s.size();i++){
        if(s[i]!='.'){
            ans+=s[i];
            continue;
        }
        bool flagb=0,flagw=0;
        for(int j=0;j<c.size();j++){
            if(i==0)continue;
            int it=prelast[i-1][j];
            if(it==-1)continue;
            if(prefb[i]-prefb[it]>0)continue;
            if(j==c.size()-1){
                if(prefb[s.size()-1]-prefb[it]==0)flagw=1;
                continue;
            }
            int it2=sufflast[i+1][j+1];
            if(it2==-1)continue;
            if(prefb[it2-1]-prefb[i]>0)continue;
            flagw=1;
        }
        int it3=sufflast[i+1][0];
        if(it3!=-1 && prefb[it3-1]==0)flagw=1;
        for(int j=0;j<c.size();j++){
            int it=last[i][j];
            if(it==2e9)continue;
            if(it-c[j]+1<=i){
                flagb=1;
            }
        }
        if(flagb && flagw)ans+='?';
        else if(flagb)ans+='X';
        else ans+='_';
    }
    return ans;
}

컴파일 시 표준 에러 (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...