제출 #553797

#제출 시각아이디문제언어결과실행 시간메모리
553797Nereus922Painting Walls (APIO20_paint)C++17
12 / 100
84 ms20944 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;

vector<set<int>> F;
vector<int> can;
vector<vector<int>> arra;
 
int minimumInstructions(int n, int m, int K, vector<int> C, vector<int> A, vector<vector<int>> B){
    F.resize(K);
    can.resize(n,0);
    arra.resize(K);

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

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

    for(int i = 0 ; i < m ; i++){
        int last = n+1,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...