# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
717446 | 2023-04-01T23:46:27 Z | schiftyfive4 | 벽 칠하기 (APIO20_paint) | C++14 | 0 ms | 0 KB |
#include "paint.h" #include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.hpp" #else #define debug(...) "MJ >> LAMELO" #endif int minimumInstructions( int N, int M, int K, std::vector<int> C, std::vector<int> A, std::vector<std::vector<int>> B) { vector<vector<int>> g(k); for (int i = 0; i < M; i++) { for (int j : B[i]) { g[j].push_back(i); } } int cnt_m = 0; vector<int> cnt(M); for (int i = 0; i < M; i++) { for (int j : g[C[i]]) { int id = (j - i + M) % M; cnt[id]++; if (cnt[id] == M) { cnt_m++; } } } if (!cnt_m) { return -1; } int ans = 1; int lst = M - 1; int best = M - 1; for (int i = 1; i + M - 1 < N; i++) { for (int j : g[C[i - 1]]) { if (cnt[j] == M) { cnt_m--; } cnt[j]--; } for (int j : g[C[i + M - 1]]) { cnt[(j + 1) % M]++; if (cnt[(j + 1) % M] == M) { cnt_m++; } } if (cnt_m) { best = i + M - 1; } if (i == lst + 1) { if (best < i) { return -1; } ans++; lst = best; } } if (best < n - 1) { return -1; } if (lst < best) { ans++; } return ans; }