#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;
i += m-1;
}
}
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]) {
pq.push({dp[i], 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], pq.top().first + 1);
}
//dp[i] = min(dp[i], dp[i-1]);
}
pq.push({dp[i], i});
}
if (dp[n-1] == INF) return -1;
else return dp[n-1];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |