제출 #429758

#제출 시각아이디문제언어결과실행 시간메모리
429758Peti벽 칠하기 (APIO20_paint)C++14
100 / 100
465 ms15388 KiB
#include <bits/stdc++.h>
#include "paint.h"

using namespace std;

int minimumInstructions(int n, int m, int k, std::vector<int> c, std::vector<int> a, std::vector<std::vector<int>> b) {

    vector<vector<int>> inds(k);
    for(int i = 0; i < m; i++)
        for(int x : b[i])
            inds[x].push_back(i);

    for(int i = 0; i < k; i++)
        reverse(inds[i].begin(), inds[i].end());

    vector<pair<int, int>> last(m, make_pair(-2, 0));
    vector<int> kezd(n, 0), veg(n, 0);
    for(int i = 0; i < n; i++){
        for(int x : inds[c[i]]){
            if(x > 0 && last[x-1].first == i-1)
                last[x] = make_pair(i, last[x-1].second+1);
            else
                last[x] = make_pair(i, 1);
        }
        /*for(auto p : last)
            cout<<"("<<p.first<<", "<<p.second<<") ";
        cout<<"\n";*/
        if(last[m-1].first == i)
            veg[i] = last[m-1].second;
    }

    for(int i = 0; i < k; i++)
        reverse(inds[i].begin(), inds[i].end());

    last.assign(m, make_pair(n+1, 0));
    for(int i = n-1; i >= 0; i--){
        for(int x : inds[c[i]]){
            if(x < n-1 && last[x+1].first == i+1)
                last[x] = make_pair(i, last[x+1].second+1);
            else
                last[x] = make_pair(i, 1);
        }
        if(last[0].first == i)
            kezd[i] = last[0].second;
    }

    /*cout<<"veg: ";
    for(int x : veg)
        cout<<x<<" ";
    cout<<"\n";
    cout<<"kezd: ";
    for(int x : kezd)
        cout<<x<<" ";
    cout<<"\n";*/

    vector<pair<int, int>> v;
    for(int i = 0; i < n; i++){
        if(i < n-1 && veg[i] + kezd[i+1] >= m){
            v.emplace_back(i-veg[i]+1, i + kezd[i+1] - m + 1);
        } else if(veg[i] == m)
            v.emplace_back(i-veg[i]+1, i-veg[i]+1);
    }

    /*cout<<"ints:\n";
    for(auto p : v)
        cout<<p.first<<" "<<p.second<<"\n";*/

    sort(v.begin(), v.end());

    int x = 0, e = 0, legn = -m-1, meg = 0;
    while(e < n){
        while(x < (int)v.size() && v[x].first <= e)
            legn = max(legn, v[x++].second);
        if(legn+m <= e)
            return -1;
        e = min(e+m, legn+m);
        meg++;
    }

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