# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
384734 | kwongweng | 벽 칠하기 (APIO20_paint) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "paint.h"
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef long long ll;
#define FOR(i, a, b) for(int i = a; i < b; i++)
#define ROF(i, a, b) for(int i = a; i >= b; i--)
int minimumInstructions(int n, int m, int k, vi c, vi a, vector<vi> b) {
int ans = 1;
vi num(m);
vector<vi> con;
FOR(i, 0, k){
vi q;
con.pb(q);
}
FOR(i, 0, m){
FOR(j, 0, a[i]){
con[b[i][j]].push_back(i);
}
}
FOR(i, 0, m){
FOR(j, 0, con[c[i]].size()){
int k = con[c[i]][j];
k = (k + m - i) % m;
num[k]++;
}
}
int cnt = 0;
FOR(i, 0, m){
if (num[i] == m) cnt++;
}
vi check(n);
if (cnt > 0) check[0] = 1;
FOR(i, 0, n-m){
FOR(j, 0, con[c[i]].size()){
int k = con[c[i]][j];
k = (k + m - i) % m;
if (num[k] == m) cnt--;
num[k]--;
}
FOR(j, 0, con[c[i+m]].size()){
int k = con[c[i+m]][j];
k = (k + m - i) % m;
if (num[k] == m-1) cnt++;
num[k]++;
}
if (cnt > 0) check[i+1] = 1;
}
bool sol = true;
int cur = 0;
while (cur < n-m){
if (check[cur] != 1){
ans = -1; break;
}
ans++;
int r = -1;
ROF(i, cur + m, cur+1){
if (check[i] == 1){
r = i;
break;
}
}
if (r == -1){
ans = - 1; break;
}
cur = r;
}
if (check[n-m] != 1) ans = -1;
else return ans;
}