제출 #1245105

#제출 시각아이디문제언어결과실행 시간메모리
1245105candi_ositosPaint By Numbers (IOI16_paint)C++20
7 / 100
0 ms328 KiB
#include "paint.h" #include <bits/stdc++.h> #define fi first #define se second #define pb push_back using namespace std; vector <int> comb(vector <vector <int> > aux, string fr){ int n=aux.size(); int m=aux[0].size(); for(int i=0; i<m; ++i){ if(fr[i]!='?'){ int nose=aux[0][i]; for(int j=1; j<n; ++j){ if(nose!=aux[j][i]){ nose=2; break; } } if(nose==1 && fr[i]=='_'){ nose=2; } if(nose==0 && fr[i]=='X'){ nose=2; } if(nose==2){ fr[i]='?'; } else if(nose==1){ fr[i]='X'; } else{ fr[i]='_'; } } } vector <int> ans; ans.resize(m); for(int i=0; i<m; ++i){ if(fr[i]=='?'){ ans[i]=2; } else if(fr[i]=='X'){ ans[i]=1; } else if(fr[i]=='_'){ ans[i]=0; } } return ans; } string solve_puzzle(string s, vector <int> c){ string fr=""; int n=s.length(); for(int i=0; i<n; ++i){ fr+='.'; } s+="_"; int k=c.size(); ++n; vector < vector <pair <int, vector <int> > > > DP; vector <int> ps; ps.resize(n+1); ps[n-1]=k; ps[n]=k; for(int i=n-2; i>=0; --i){ if(ps[i+1]>0){ int xd=ps[i+1]; for(int j=c[xd-1]; j>=0; --j){ ps[i]=xd-1; --i; } ++i; } else{ ps[i]=0; } } DP.resize(n); if(s[0]!='_'){ bool me=1; for(int i=0; i<c[0]; ++i){ if(s[i]=='_'){ me=0; break; } } if(me){ if(s[c[0]]!='X'){ vector <int> aux; aux.assign(c[0], 1); aux.pb(0); DP[c[0]].pb({1, aux}); } } } if(s[0]!='X'){ DP[0].pb({0, {0}}); } for(int i=1; i<n; ++i){ sort(DP[i-1].begin(), DP[i-1].end()); int us=0; vector <pair <int, vector <int> > > nah; for(int j=0; j<DP[i-1].size(); j=us+1){ us=j; if(us<DP[i-1].size()-2){ int tdems=DP[i-1].size(); while(DP[i-1][us].fi==DP[i-1][us+1].fi && us<tdems-2){ ++us; } } if(us==DP[i-1].size()-2){ if(DP[i-1][us].fi==DP[i-1][us+1].fi){ ++us; } } vector <vector <int> > aux; aux.resize(0); for(int l=j; l<=us; ++l){ aux.pb(DP[i-1][l].se); } DP[i-1][j].se=comb(aux, fr); nah.pb(DP[i-1][j]); } DP[i-1].resize(nah.size()); for(int j=0; j<nah.size(); ++j){\ DP[i-1][j]=nah[j]; } for(int j=0; j<DP[i-1].size(); ++j){ bool nose=1; vector <int> aux=DP[i-1][j].se; if(DP[i-1][j].fi==k){ for(int l=i; l<n; ++l){ if(s[l]=='X'){ nose=0; break; } } if(nose){ for(int l=i; l<n; ++l){ aux.pb(1); } DP[n-1].pb({k, aux}); } } else{ for(int l=0; l<c[DP[i-1][j].fi]; ++l){ if(s[l+i]=='_'){ nose=0; } } if(nose){ if(s[i+c[DP[i-1][j].fi]-1]!='X'){ for(int l=0; l<c[DP[i-1][j].fi]; ++l){ aux.pb(1); } aux.pb(0); DP[i+c[DP[i-1][j].fi]-1].pb({DP[i-1][j].fi+1, aux}); } } if(s[i]!='X' && ps[i+1]<=DP[i-1][j].fi){ DP[i].pb(DP[i-1][j]); DP[i][DP[i].size()-1].se.pb(0); } } } DP[i-1].resize(0); } --n; vector <vector <int> > TDP; for(int i=0; i<DP[n].size(); ++i){ if(DP[n][i].fi==k){ TDP.pb(DP[n][i].se); } } if(TDP.size()==0){ return fr; } for(int j=0; j<n; ++j){ if(fr[j]!='?'){ int as=TDP[0][j]; for(int i=0; i<TDP.size(); ++i){ if(as!=TDP[i][j] || as==2){ fr[j]='?'; break; } if(i==TDP.size()-1){ if(TDP[i][j]==0){ fr[j]='_'; break; } fr[j]='X'; break; } } } } return fr; }

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