Submission #1269205

#TimeUsernameProblemLanguageResultExecution timeMemory
1269205jojeonghoon벽 칠하기 (APIO20_paint)C++20
40 / 100
43 ms17308 KiB
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <vector>
#include <map>
#include <set>
#define ll long long
using namespace std;

const int LM=100100;
int N,M,K;
vector<int> C, A;
vector<vector<int>>B, E;
ll D[LM], w[LM], ch[LM];
vector<int> pr;

void F(int x, int color){
    ll 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;
    }
    
    ll 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;
}
#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...