제출 #309681

#제출 시각아이디문제언어결과실행 시간메모리
309681lohachoPaint By Numbers (IOI16_paint)C++14
100 / 100
470 ms326452 KiB
#include "paint.h" #include <cstdlib> #include <bits/stdc++.h> using namespace std; using LL = long long; const int MOD = (int)1e9 + 7; const int NS = (int)2e5 + 4; int N, k; int dpl[NS][104], dpr[NS][104], jump[NS][104]; int jpref[104][NS]; int wpref[NS]; int lw[NS], rw[NS]; string ans; std::string solve_puzzle(std::string s, std::vector<int> c) { N = (int)s.size(), k = (int)c.size(); s = '?' + s; c.push_back(0); for(int i = 1; i <= N; ++i){ lw[i] = lw[i - 1]; if(s[i] == '_'){ lw[i] = i; } } rw[N + 1] = N + 1; for(int i = N; i >= 1; --i){ rw[i] = rw[i + 1]; if(s[i] == '_'){ rw[i] = i; } } for(int i = k; i >= 1; --i){ c[i] = c[i - 1]; } for(int i = 1; i <= N; ++i){ wpref[i] = wpref[i - 1] + (s[i] == '_'); } dpl[0][0] = 1; int canzero = 1; for(int i = 1; i <= N; ++i){ if(s[i] == 'X'){ canzero = 0; continue; } dpl[i][0] = canzero; for(int j = 1; j <= k; ++j){ dpl[i][j] |= dpl[i - 1][j]; if(i - c[j] - 1 >= 0){ if(wpref[i - 1] - wpref[i - c[j] - 1]){ continue; } dpl[i][j] |= dpl[i - c[j] - 1][j - 1]; } } } dpr[N + 1][k + 1] = 1; canzero = 1; for(int i = N; i >= 1; --i){ if(s[i] == 'X'){ canzero = 0; continue; } dpr[i][k + 1] = canzero; for(int j = k; j >= 1; --j){ dpr[i][j] |= dpr[i + 1][j]; if(i + c[j] <= N){ if(wpref[i + c[j]] - wpref[i]){ continue; } dpr[i][j] |= dpr[i + c[j] + 1][j + 1]; } } } for(int i = 0; i <= N; ++i){ if(s[i] == 'X'){ continue; } for(int j = 1; j <= k; ++j){ int r = i + c[j] + 1; if(r > N + 1){ continue; } if(wpref[r - 1] - wpref[i]){ continue; } jump[i][j] = (dpl[i][j - 1] & dpr[r][j + 1]); if(jump[i][j]){ ++jpref[j][i]; } } } for(int i = 1; i <= k; ++i){ for(int j = 1; j <= N + 1; ++j){ jpref[i][j] += jpref[i][j - 1]; } } for(int i = 1; i <= N; ++i){ if(s[i] != '.'){ ans += s[i]; continue; } int canw = 0, canb = 0; for(int j = 0; j <= k; ++j){ if(dpl[i][j] & dpr[i][j + 1]){ canw = 1; break; } } if(!canw){ ans += 'X'; continue; } int l_ = lw[i], r_ = rw[i]; for(int j = 1; j <= k; ++j){ int posl = max(l_, i - c[j]), posr = min(r_, i + c[j]) - c[j] - 1; if(posl > posr){ continue; } if(jpref[j][posr] - jpref[j][posl - 1]){ canb = 1; break; } } if(!canb){ ans += '_'; } else{ ans += '?'; } } return ans; }
#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...