Submission #1226023

#TimeUsernameProblemLanguageResultExecution timeMemory
1226023SpyrosAlivPainting Walls (APIO20_paint)C++20
0 / 100
1 ms328 KiB
#include "paint.h" #include <bits/stdc++.h> using namespace std; int n, m, k; vector<int> c; vector<set<int>> cov; const int INF = 1e9; vector<int> likedBy; bool check(int idx) { int start = likedBy[c[idx]]; if (start == -1) return false; bool flag = true; for (int j = 0; j < m; j++) { int i = idx + j; int curr = (start + j) % m; if (cov[curr].find(c[i]) != cov[curr].end()) continue; else { flag = false; break; } } if (flag) return true; return false; } int minimumInstructions(int N, int M, int K, vector<int> C, vector<int> A, vector<vector<int>> B) { n = N; m = M; k = K; c = C; cov.resize(m); likedBy.assign(k, -1); for (int i = 0; i < m; i++) { for (auto x: B[i]) { cov[i].insert(x); likedBy[x] = i; } } vector<bool> pos(n, false); vector<pair<int, int>> ranges; for (int i = 0; i <= n - m; i++) { if (check(i)) { ranges.push_back({i, i + m - 1}); pos[i + m - 1] = true; } } vector<int> dp(n, INF); priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; for (int i = m-1; i < n; i++) { if (!pos[i]) { continue; } else { int prev = i - m; if (prev < 0) dp[i] = 1; else { while (!pq.empty() && pq.top().second < i - m) pq.pop(); if (!pq.empty()) dp[i] = min(dp[i], dp[pq.top().first] + 1); } pq.push({dp[i], i}); //dp[i] = min(dp[i], dp[i-1]); } } if (dp[n-1] == INF) return -1; else return dp[n-1]; }
#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...