Submission #717166

#TimeUsernameProblemLanguageResultExecution timeMemory
717166LittleCubePainting Walls (APIO20_paint)C++14
28 / 100
1576 ms1496 KiB
#pragma GCC optimize("Ofast,unroll-loops")
#include "paint.h"
#ifndef EVAL
#include "grader.cpp"
#endif
#include <bits/stdc++.h>
#define pii pair<int, int>
#define F first
#define S second
using namespace std;

int minimumInstructions(
    int N, int M, int K, vector<int> C,
    vector<int> A, vector<vector<int>> B)
{

  auto match = [&](int i, int j)
  {
    auto iter = lower_bound(B[j].begin(), B[j].end(), C[i]);
    if (iter != B[j].end() && *iter == C[i])
      return 1;
    return 0;
  };
  vector<int> cover(N, 0), dp(N, 0);
  for (int x = 0; x < M; x++)
  {
    int cnt = 0;
    for (int y = 0; y < M; y++)
      cnt += match(y, (x + y) % M);
    for (int y = 0; y < N - M; y++)
    {
      if (cnt == M)
        cover[y] = 1;
      cnt -= match(y, (x + y) % M);
      cnt += match(y + M, (x + y + M) % M);
    }
    if (cnt == M)
      cover[N - M] = 1;
  }
  for (int i = 0; i < N; i++)
  {
    dp[i] = (cover[i] ? i : (i ? dp[i - 1] : -1e9));
  }
  int cur = 0, ans = 0;
  while (cur < N)
  {
    if (dp[cur] + M <= cur)
      break;
    cur = max(cur, dp[cur] + M), ans++;
  }
  return (cur < N ? -1 : ans);
}
#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...