제출 #204502

#제출 시각아이디문제언어결과실행 시간메모리
204502anonymousPaint By Numbers (IOI16_paint)C++14
100 / 100
576 ms54136 KiB
#include "paint.h" #include <iostream> #include<string> #include<vector> #define MAXN 200005 #define MAXK 105 using namespace std; int N, K, whitesum[MAXN], canblack[MAXN], black; bool dp[MAXN][MAXK], done[MAXN][MAXK], canwhite[MAXN]; string s; vector <int> c; bool gen(int i, int j) { if (i >= N && j == K) {return(1);} if (i >= N && j < K) {return(0);} if (done[i][j]) {return(dp[i][j]);} done[i][j]=true; if (s[i] != 'X' && gen(i+1,j)) { dp[i][j]=true; canwhite[i]=true; } if (j < K && i + c[j] <= N) { bool can = true; if (whitesum[i+c[j]] - whitesum[i] > 0 || (i+c[j] != N && s[i+c[j]] == 'X')) { can=false; } if (can && gen(i+c[j]+1, j+1)) { dp[i][j]=true; canblack[i]++; canblack[i+c[j]]--; canwhite[i+c[j]]=true; } } return(dp[i][j]); } string solve_puzzle(string S, vector<int> C) { N=S.size(), K=C.size(); s = S, c = C; for (int i=1; i<=N; i++) { whitesum[i]=whitesum[i-1] + (S[i-1] == '_'); } gen(0,0); string Sol; for (int i=0; i<N; i++) { black+=canblack[i]; if (black && canwhite[i]) { Sol.push_back('?'); } else if (black) { Sol.push_back('X'); } else { Sol.push_back('_'); } } return(Sol); }
#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...