# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
384734 | kwongweng | Painting Walls (APIO20_paint) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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;
}