제출 #1347272

#제출 시각아이디문제언어결과실행 시간메모리
1347272goodpjw2008벽 칠하기 (APIO20_paint)C++20
100 / 100
620 ms261452 KiB
#include <bits/stdc++.h>
using namespace std;
vector<int>col[100010],pos[50010],pre;
int dif[100010];
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(int &c:B[i])col[c].push_back(i);
    }
    for(int i = 0; i < N; i++){
        if(col[C[i]].empty())return -1;
    }
    for(int i = 0; i < N; i++){
        for(int &j:col[C[i]]){
            pos[(j%M-i%M+M)%M].push_back(i);
        }
    }
    if(N<M)return -1;
    for(int d = 0; d < M; d++){
        auto &v=pos[d];
        if(v.empty())continue;
        int sz=v.size(),idx=0;
        while(idx<sz){
            int s=v[idx++],e=s;
            while(idx<sz&&v[idx]==e+1){
                e=v[idx++];
            }
            if(e-s+1>=M){
                int yl=s,yh=e-M+1;
                if(yl<=N-M&&yh>=0){
                    yl=max(yl,0);
                    yh=min(yh,N-M);
                    if(yl<=yh){
                        dif[yl]++;
                        dif[yh+1]--;
                    }
                }
            }
        }
    }
    int sum=0;
    for(int i = 0; i < N-M+1; i++){
        sum+=dif[i];
        if(sum>0)pre.push_back(i);
    }
    if(pre.empty())return -1;
    int cur=0,p=0,ans=0;
    while(cur<N){
        int b=-1;
        while(p<pre.size()&&pre[p]<=cur){
            b=max(b,pre[p++]+M-1);
        }
        if(b<cur)return -1;
        ans++;
        cur=b+1;
    }
    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...