# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1269200 | jojeonghoon | Painting Walls (APIO20_paint) | C++20 | 0 ms | 0 KiB |
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <vector>
#include <map>
#include <set>
#define int long long
using namespace std;
const int LM=100100;
int N,M,K;
vector<int> C, A;
vector<vector<int>>B, E;
int D[LM], w[LM], ch[LM];
vector<int> pr;
void F(int x, int color){
int d=0;
for(int i:E[color]){
int t=(i-x+M+N)%M;
ch[t]=1;
d=max(++w[t], d);
}
D[x]=d;
for(int i:pr) if(!ch[i]) w[i]=0;
pr.clear();
for(int i:E[color]){
ch[i]=0;
pr.push_back(i);
}
}
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_, A=A_, B=B_;
E.assign(K, {});
for(int i=0; i<M; i++){
for(int j=0; j<A[i]; j++){
E[B[i][j]].push_back(i);
}
}
for(int i=0; i<N; i++){
F(i, C[i]);
if(D[i]==0) return -1;
}
int k=0;
for(int i=0; i<N; i++){
k++;
if(D[i] >= D[i+1]){
if(D[i]<M) return -1;
if(D[i+1] <= k%M){
k = (k+M-1)/M*M;
}
}
}
return (k+M-1)/M;
}