Submission #935070

#TimeUsernameProblemLanguageResultExecution timeMemory
935070oblantisPaint By Numbers (IOI16_paint)C++17
100 / 100
200 ms80652 KiB
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #pragma GCC optimize("O3,unroll-loops") #include <bits/stdc++.h> #define all(v) v.begin(), v.end() #define pb push_back #define ss second #define ff first #define vt vector using namespace std; typedef long long ll; typedef pair<int, int> pii; const int inf = 1e9; const int mod = 1e9+7; const int maxn = 2e5 + 4; //#include "paint.h" bool dp[maxn][101], pd[maxn][101], DP[maxn][101], PD[maxn][101]; string solve_puzzle(string s, vector<int> c) { int n = s.size(), k = c.size(); dp[0][0] = DP[0][0] = 1; s = "$" + s + "$"; for(int i = 1, ls = 0; i <= n; i++){ if(s[i] == '_'){ ls = i; for(int j = 0; j <= k; j++)DP[i][j] = DP[i - 1][j]; } else { for(int j = 0; j < k; j++){ if(ls <= i - c[j]){ if(i == c[j]){ if(j == 0)dp[i][1] = 1; } else if(s[i - c[j]] != 'X')dp[i][j + 1] |= DP[i - c[j] - 1][j]; } } if(s[i] == 'X'){ for(int j = 0; j <= k; j++)DP[i][j] = dp[i][j]; } else for(int j = 0; j <= k; j++)DP[i][j] = dp[i][j] | DP[i - 1][j]; } } pd[n + 1][0] = PD[n + 1][0] = 1; for(int i = n, ls = n + 1; i >= 1; i--){ if(s[i] == '_'){ ls = i; for(int j = 0; j <= k; j++)PD[i][j] = PD[i + 1][j]; } else { for(int j = 0; j < k; j++){ if(ls >= i + c[k - j - 1]){ if(i + c[k - j - 1] == n + 1){ if(j == 0)pd[i][1] = 1; } else if(s[i + c[k - j - 1]] != 'X')pd[i][j + 1] |= PD[i + c[k - j - 1] + 1][j]; } } if(s[i] == 'X'){ for(int j = 0; j <= k; j++)PD[i][j] = pd[i][j]; } else for(int j = 0; j <= k; j++)PD[i][j] = pd[i][j] | PD[i + 1][j]; } } string ret = ""; int r = 0; for(int i = 1; i <= n; i++){ for(int j = 0; j < k; j++){ if(s[i - 1] != 'X' && ((i == 1) ? (j == 0) : DP[i - 2][j]) && pd[i][k - j])r = max(r, i + c[j] - 1); } if(s[i] != '.'){ ret += s[i]; continue; } if(i <= r){ bool ok = 0; for(int j = 0; j <= k; j++){ if(s[i] != 'X' && DP[i - 1][j] && PD[i + 1][k - j]){ ok = 1; break; } } if(ok)ret += '?'; else ret += 'X'; } else ret += '_'; } return ret; } //void solve() { //string s; //int n; //cin >> s >> n; //vt<int> c(n); //for(int i = 0; i < n; i++){ //cin >> c[i]; //} //cout << solve_puzzle(s, c); //} //int main() { //ios_base::sync_with_stdio(0); //cin.tie(0); //int times = 1; ////cin >> times; //for(int i = 1; i <= times; i++) { //solve(); //} //return 0; //}
#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...