Submission #298661

#TimeUsernameProblemLanguageResultExecution timeMemory
298661BruteforcemanPainting Walls (APIO20_paint)C++11
100 / 100
564 ms15608 KiB
#include "bits/stdc++.h" #include "paint.h" using namespace std; const int maxn = 1e5 + 10; const int inf = 1e9; vector <int> col[maxn]; int opt[2][maxn]; int c[maxn]; int n, m; bool good[maxn]; int dp[maxn]; int minimumInstructions( int N, int M, int K, std::vector<int> C, std::vector<int> A, std::vector<std::vector<int>> B) { n = N; m = M; for(int i = 0; i < n; i++) { c[i] = C[i]; } for(int i = 0; i < m; i++) { for(int j : B[i]) { col[j].push_back(i); } } int row = 0; for(int i = n - 1; i >= 0; i--) { good[i] = false; row ^= 1; for(int j : col[c[i]]) { opt[row][j] = opt[row ^ 1][(j + 1) % m] + 1; if(opt[row][j] >= m) good[i] = true; } if(i < n - 1) { for(int j : col[c[i + 1]]) { opt[row ^ 1][j] = 0; } } } for(int i = 0; i < n; i++) dp[i] = inf; dp[n] = 0; deque <pair <int, int>> Q; Q.push_front(make_pair(dp[n], n)); for(int i = n; i >= 0; i--) { while(!Q.empty() && Q.back().second > i + m) { Q.pop_back(); } if(good[i]) { dp[i] = 1 + Q.back().first; } while(!Q.empty() && Q.front().first >= dp[i]) { Q.pop_front(); } Q.push_front(make_pair(dp[i], i)); } return dp[0] >= inf ? -1 : dp[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...