제출 #1226019

#제출 시각아이디문제언어결과실행 시간메모리
1226019SpyrosAlivPainting Walls (APIO20_paint)C++20
0 / 100
1597 ms13940 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);
  for (int i = m-1; i < n; i++) {
    if (!pos[i]) {
      continue;
    }
    else {
      int prev = i - m;
      if (prev < 0) dp[i] = 1;
      else {
        for (int j = i - m; j < i; j++) {
          dp[i] = min(dp[i], dp[j] + 1);
        }
      }
      //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...