제출 #294982

#제출 시각아이디문제언어결과실행 시간메모리
294982PlurmPaint By Numbers (IOI16_paint)C++11
100 / 100
441 ms44212 KiB
#include "paint.h" #include <bits/stdc++.h> using namespace std; int qsw[200005]; int qsb[200005]; int evp[200005]; int qs[200005]; bool dp[128][200005]; bool dpb[128][200005]; bool dps[128][200005]; string solve_puzzle(string s, vector<int> c){ int n = s.size(); s.insert(s.begin(), '0'); for(int i = 1; i <= n; i++){ if(s[i] == '_') qsw[i] = qsw[i-1]+1; else qsw[i] = qsw[i-1]; if(s[i] == 'X') qsb[i] = qsb[i-1]+1; else qsb[i] = qsb[i-1]; } string out = s; int k = c.size(); c.insert(c.begin(), 0); for(int i = 0; i <= n+1; i++){ dp[0][i] = true; dpb[k+1][i] = true; dps[k+1][i] = true; } for(int j = 1; j <= k; j++){ for(int i = c[j]; i <= n; i++){ // if end of block is i, if(s[i] != 'X') dp[j][i] |= dp[j][i-1]; if((i-c[j] == 0 || s[i-c[j]] != 'X') && qsw[i] - qsw[i-c[j]] == 0){ bool clause = i-c[j] == 0 ? j == 1 : dp[j-1][i-c[j]-1]; if(j == 1) clause &= qsb[i-c[j]] == 0; dp[j][i] |= clause; } } } for(int j = k; j > 0; j--){ for(int i = n-c[j]+1; i > 0; i--){ if(s[i] != 'X') dps[j][i] |= dps[j][i+1]; if((i+c[j] == n+1 || s[i+c[j]] != 'X') && qsw[i+c[j]-1] - qsw[i-1] == 0){ bool clause = i+c[j] == n+1 ? j == k : dps[j+1][i+c[j]+1]; if(j == k) clause &= qsb[n] - qsb[i+c[j]-1] == 0; if(j != 1) clause &= dp[j-1][i-2] && s[i-1] != 'X'; else clause &= qsb[i-1] == 0; dps[j][i] |= clause; } } } for(int j = 1; j <= k; j++){ for(int i = c[j]; i <= n; i++){ // if end of block is i, dp[j][i] = false; if(s[i] != 'X') dp[j][i] |= dp[j][i-1]; if((i-c[j] == 0 || s[i-c[j]] != 'X') && qsw[i] - qsw[i-c[j]] == 0){ bool clause = i-c[j] == 0 ? j == 1 : dp[j-1][i-c[j]-1]; if(j == 1) clause &= qsb[i-c[j]] == 0; if(j != k) clause &= dps[j+1][i+2] && s[i+1] != 'X'; else clause &= qsb[n] - qsb[i] == 0; dp[j][i] |= clause; if(clause){ evp[i-c[j]+1]++; evp[i+1]--; } } } } for(int i = 1; i <= n; i++){ qs[i] = qs[i-1] + evp[i]; if(qs[i] > 0) out[i] = s[i] == '.' ? 'x' : s[i]; else out[i] = '_'; } for(int i = 1; i <= n; i++){ for(int j = 0; j <= k; j++){ if(dp[j][i-1] && dps[j+1][i+1]){ // i can be _ if(out[i] == 'x') out[i] = '?'; } } } for(int i = 1; i <= n; i++){ if(out[i] == 'x') out[i] = 'X'; } out.erase(out.begin()); return out; }
#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...