제출 #285329

#제출 시각아이디문제언어결과실행 시간메모리
285329mohamedsobhi777Paint By Numbers (IOI16_paint)C++14
100 / 100
968 ms55988 KiB
#include<bits/stdc++.h> #include "paint.h" //#pragma GCC optimize("trapv") #define I inline void using namespace std ; using ll = long long ; using ld = long double ; const int N = 1e6 + 7 , mod = 1e9 + 7 ; // How interesting! int n , k ; string S ; std::vector<int> gc; int mask[N] ; bool viz[200005][103] ; bool dp[200005][103] ; int pre[N] ; bool solve(int i , int j){ if(viz[i][j]) return dp[i][j] ; viz[i][j] = 1; if(i >= n) return dp[i][j] = (j == k) ; bool ret = 0 ; if(j < k){ if( i + gc[j] <= n && S[i+gc[j]] != 'X'){ bool bad = !!(pre[i+gc[j]-1] - (i?pre[i-1]:0)); if(!bad && solve(i+gc[j] + 1 , j+1)){ ret = 1; for(int r = i ;r < i + gc[j] ;r++){ mask[r]|=1 ; } mask[i+gc[j]]|=2 ; } } } if(S[i] != 'X' && solve(i+1 , j)){ ret = 1; mask[i] |= 2 ; } return dp[i][j] = ret ; } std::string solve_puzzle(std::string s, std::vector<int> c) { gc = c ; S = s + '.' ; n = (int) s.size() ; k = (int) c.size() ; for(int i = 0 ;i < n;i++){ pre[i] = (S[i] == '_') ; if(i)pre[i] += pre[i-1] ; } solve(0 , 0) ; for(int i = 0 ;i < n;i++){ if(s[i] == '.'){ if(mask[i] == 3) s[i] = '?' ; else if(mask[i] == 1) s[i] = 'X' ; else if(mask[i] == 2) s[i] = '_' ; } } return s; }
#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...