제출 #553801

#제출 시각아이디문제언어결과실행 시간메모리
553801Nereus922벽 칠하기 (APIO20_paint)C++17
100 / 100
1247 ms267208 KiB
#include "paint.h"
#include <bits/stdc++.h>
#define pb push_back
#define f first
#define sc second
using namespace std;
typedef long long int ll;
typedef string str;

const int nax = 1e5 + 10;
int can[nax];
vector<int> arra[nax],F[nax];
 
int minimumInstructions(int n, int m, int K, vector<int> C, vector<int> A, vector<vector<int>> B){

    for(int i = 0 ; i < m ; i++){
        for(auto c : B[i]) F[c].pb(i);
    }

    for(int i = 0 ; i < n ; i++){
        for(auto con : F[C[i]]){
            int st = ((con-i)%m + m)%m;
            arra[st].pb(i);
        }
    }

    for(int i = 0 ; i < m ; i++){
        int last = -n,cnt = 0;
        for(auto e : arra[i]){
            if(e != last + 1){
                if(cnt >= m){
                    for(int j = last-cnt+1 ; j <= last-m+1 ; j++){
                        can[j] = 1;
                    }
                }
                cnt = 0;
            }
            last = e;
            cnt++;
        }
        if(cnt >= m){
            for(int j = last-cnt+1 ; j <= last-m+1 ; j++){
                can[j] = 1;
            }
        }
    }

    if(can[0] == 0) return -1;

    for(int i = 0 ; i < n ; i++){
        if(can[i] == 1) can[i] = i+m;
        else can[i] = can[i-1];
    }

    int ans = 0;

    for(int i = 0 ; i < n ;){
        if(can[i] <= i) return -1;
        i = can[i];
        ans++;
    }

    return ans;
}
#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...