제출 #69104

#제출 시각아이디문제언어결과실행 시간메모리
69104nvmdavaPaint By Numbers (IOI16_paint)C++17
59 / 100
4 ms728 KiB
//#include "paint.h" #include <bits/stdc++.h> using namespace std; bool pos[200001][101]; string ans, s; int c[200001], last[200001], d[200001]; vector<int> v; bool swapx(int i, int j){ if(i + 1 < v[j]){ return 0; } if(i >= v[j]){ if(s[i - v[j]] == 'X'){ return 0; } } if(i - last[i] + 1 < v[j]){ return 0; } if(i >= v[j]) return pos[i - v[j]][j]; return pos[i - v[j] + 1][j]; } bool go[200001][101]; void check(int n, int k){ if(go[n][k]){ return; } go[n][k] = 1; if(k == 0){ for(int i = 0; i < n; i++){ d[i] |= 1; } return; } if(s[n - 1] == '_'){ check(n - 1, k); } else if(s[n - 1] == 'X'){ int i; for(i = 1; i <= v[k - 1]; i++){ d[n - i] |= 2; } if(n >= i)d[n - i] |= 1; check(n - v[k - 1] - 1, k - 1); } else { if(pos[n - 1][k]){ d[n - 1] |= 1; check(n - 1, k); } if(pos[n - v[k - 1]][k - 1] && n - last[n - 1] >= v[k - 1]){ int i; for(i = 1; i <= v[k - 1]; i++){ d[n - i] |= 2; } if(n >= i)d[n - i] |= 1; check(n - v[k - 1] - 1, k - 1); } } } string solve_puzzle(string s, vector<int> v) { ::v = v; ::s = s; last[0] = -1; int n = v.size(), sz = s.size(), i, j; for(int i = 1; i < sz; i++){ if(s[i - 1] == '_'){ last[i] = i; } else { last[i] = last[i - 1]; } } ans = s; pos[0][0] = 1; for(i = 1; i <= sz; i++){ if(s[i - 1] == 'X'){ break; } pos[i][0] = 1; } for(i = 1; i <= sz; i++){ for(j = 1; j <= n; j++){ if(i < v[j - 1]){ continue; } if(s[i - 1] == 'X'){ pos[i][j] = swapx(i - 1, j - 1); } else if(s[i - 1] =='_'){ pos[i][j] = pos[i - 1][j]; } else { pos[i][j] = (pos[i - 1][j] == 0 ? swapx(i - 1, j - 1) : 1); } // cout<<i<<" "<<j<<" "<<pos[i][j]<<"\n"; } } check(sz, n); for(int i = 0; i < sz; i++){ if(ans[i] == '.'){ switch(d[i]){ case 1: ans[i] = '_'; break; case 2: ans[i] = 'X'; break; case 3: ans[i] = '?'; break; } } } return ans; } /* int main(){ memset(pos, 0, sizeof(pos)); memset(d, 0, sizeof(d)); memset(c, 0, sizeof(c)); memset(go, 0, sizeof(go)); string s; cin>>s; int k; cin>>k; vector<int> a; while(k--){ int d; cin>>d; a.push_back(d); } cout<<solve_puzzle(s, a); main(); }*/
#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...