Submission #547483

#TimeUsernameProblemLanguageResultExecution timeMemory
547483Deepesson벽 칠하기 (APIO20_paint)C++17
40 / 100
1586 ms192424 KiB
#include "paint.h"
#include <bits/stdc++.h>
#define MAX 105000
typedef std::pair<int,int> pii;
std::map<pii,pii> pai;
std::map<pii,int> size;
int mod(int p,int M){
    p%=M;
    if(p<0)p+=M;
    return p;
}

void check(pii k){
    if(pai.find(k)==pai.end()){
        pai[k]=k;
        size[k]=1;
    }
}

pii find(pii x){
    check(x);
    auto&ref = pai[x];
    if(ref==x)
        return x;
    return ref=find(ref);
}

void Union(pii a,pii b){
    a=find(a);
    b=find(b);
    if(a!=b){
        auto& ref1 = size[a],ref2=size[b];
        if(ref1>ref2)std::swap(a,b);
        pai[a]=b;
        ref1+=ref2;
    }
}
bool pode[MAX];
int minimumInstructions(int N, int M, int K, std::vector<int> C, std::vector<int> A, std::vector<std::vector<int>> B) {
    std::map<int,std::vector<int>> curte;
    std::map<pii,bool> aprovado;
    for(int i=0;i!=M;++i){
        for(auto& x:B[i]){
            curte[x].push_back(i);
            aprovado[{x,i}]=true;
        }
    }
    for(int i=0;i!=N-1;++i){
        int cor1 = C[i],cor2 = C[i+1];
        for(auto&x:curte[cor1]){
            int tipo = x,prox = mod(x+1,M);
            if(aprovado.find({cor2,prox})!=aprovado.end())
            {
               /// std::cout<<"Liga "<<i<<" "<<tipo<<" com: "<<i+1<<" "<<prox<<"\n";
                Union({i,tipo},{i+1,prox});
            }
        }
    }
    for(int i=0;i!=N;++i){
        int fim = i+M-1;
        if(fim>=N)break;
        for(auto&x:curte[C[i]]){
            int ultimo_pintor = mod(x-1,M);
            pii alpha = find({i,x});
            pii beta = find({fim,ultimo_pintor});
           /// std::cout<<"Busca "<<i<<" "<<x<<" "<<fim<<" "<<ultimo_pintor<<"\n";
           /// std::cout<<alpha.first<<" "<<alpha.second<<" "<<beta.first<<" "<<beta.second<<"!\n";
            if(alpha==beta){
            ///    std::cout<<"Conexao "<<i<<" "<<fim<<"\n";
                pode[i]=true;
                break;
            }
        }
    }
    std::priority_queue<pii,std::vector<pii>,std::greater<pii>> queue;

    int min = 1e9;
    int last=0;

    for(int i=0;i!=N+1;++i){
        int ans=1e9;
        if(i){
            while(queue.size()){
                auto __ = queue.top();

                ///Invalido
                if(__.second<i-M){
                    queue.pop();
                    continue;
                }

                ans=__.first;
                break;

            }
        }else ans=0;

        if(pode[i])
        queue.push({ans+1,i});

     ///   std::cout<<"Custo "<<ans<<" ("<<i<<")\n";
        last=ans;
    }
    if(last>=1e9)return -1;
    ///Sucesso
    return last;
}

Compilation message (stderr)

paint.cpp: In function 'int minimumInstructions(int, int, int, std::vector<int>, std::vector<int>, std::vector<std::vector<int> >)':
paint.cpp:77:9: warning: unused variable 'min' [-Wunused-variable]
   77 |     int min = 1e9;
      |         ^~~
#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...