제출 #120713

#제출 시각아이디문제언어결과실행 시간메모리
120713arman_ferdousPaint By Numbers (IOI16_paint)C++17
100 / 100
645 ms102520 KiB
#include "paint.h" #include <bits/stdc++.h> using namespace std; using si = short int; const int N = 2e5+10; const int K = 105; int n, sum[N], can[N], sz[K], Xcnt[N]; string s; si dp[2][K][N]; int res[2][N]; si DP(int prev, int blc, int pos) { if(blc < 0) { if(pos < 1) return 1; if(Xcnt[pos] == 0) { res[0][1]++; res[0][pos + 1]--; return 1; } return 0; } if(pos < 1) return 0; si &ret = dp[prev][blc][pos]; if(ret != -1) return ret; if(s[pos] == 'X') { if(prev == 0) { if(pos - sz[blc] < 0 || sum[pos] - sum[pos - sz[blc]] > 0) return ret = 0; si got = DP(1, blc - 1, pos - sz[blc]); if(got == 1) { res[1][pos - sz[blc] + 1]++; res[1][pos + 1]--; } return ret = got; } return ret = 0; } if(s[pos] == '_') { si got = DP(0, blc, pos - 1); if(got == 1) { res[0][pos]++; res[0][pos + 1]--; } return ret = got; } si zero = DP(0, blc, pos - 1); if(zero == 1) { res[0][pos]++; res[0][pos + 1]--; } si one; if(prev == 1 || pos - sz[blc] < 0 || sum[pos] - sum[pos - sz[blc]] > 0) one = 0; else { one = DP(1, blc - 1, pos - sz[blc]); if(one == 1) { res[1][pos - sz[blc] + 1]++; res[1][pos + 1]--; } } return ret = (one | zero); } string solve_puzzle(string _s, vector<int> c) { s = "#" + _s; n = s.size(); for(int i = 0; i < (int)c.size(); i++) sz[i] = c[i]; for(int i = 1; i < n; i++) { sum[i] = sum[i - 1] + (s[i] == '_'); Xcnt[i] = Xcnt[i - 1] + (s[i] == 'X'); } memset(dp, -1, sizeof dp); DP(0, (int)c.size() - 1, n - 1); for(int i = 1; i < n; i++) { res[0][i] += res[0][i - 1]; res[1][i] += res[1][i - 1]; if(res[0][i] && res[1][i]) _s[i - 1] = '?'; else if(res[0][i]) _s[i - 1] = '_'; else _s[i - 1] = 'X'; } 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...