이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "paint.h"
#include <bits/stdc++.h>
#define MAX 100004
typedef std::pair<int,int> pii;
pii pai[MAX][633];
int mod(int p,int M){
p%=M;
if(p<0)p+=M;
return p;
}
pii find(pii x){
auto&ref = pai[x.first][x.second];
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.first][a.second]=b;
/// ref1+=ref2;
}
}
bool pode[MAX];
std::vector<int> curte[MAX];
int get_num(int pos,int val){
int l=0,r=curte[pos].size()-1;
if(r<l)return -1;
int obj = val;
while(l<r){
int m = (l+r+1)/2;
if(curte[pos][m]>obj){
r=m-1;
}else l=m;
}
if(l<0)return -1;
/// std::cout<<pos<<" "<<l<<"\n";
if(curte[pos][l]==val)return l;
return -1;
}
int minimumInstructions(int N, int M, int K, std::vector<int> C, std::vector<int> A, std::vector<std::vector<int>> B) {
for(int i=0;i!=MAX;++i){
for(int j=0;j!=700;++j){
pai[i][j]={i,j};
}
}
for(int i=0;i!=M;++i){
for(auto& x:B[i]){
curte[x].push_back(i);
}
}
for(int i=0;i!=N-1;++i){
int cor1 = C[i],cor2 = C[i+1];
for(int j=0;j!=curte[cor1].size();++j){
auto x=curte[cor1][j];
int tipo = x,prox = mod(x+1,M);
bool ok=false;
/// std::cout<<"Tentando "<<j<<" "<<i<<"\n";
int ans;
{
int l=0,r=curte[cor2].size()-1;
if(r<l)break;
int obj = prox;
while(l<r){
int m = (l+r+1)/2;
if(curte[cor2][m]>obj){
r=m-1;
}else l=m;
}
if(curte[cor2][l]==obj)ok=true;
ans=l;
}
/// std::cout<<"Tentou\n";
if(ok)
{
Union({i,j},{i+1,ans});
/// std::cout<<"Liga "<<i<<" "<<j<<" com: "<<i+1<<" "<<ans<<"\n";
}
}
}
for(int i=0;i!=N;++i){
int fim = i+M-1;
if(fim>=N)break;
/// std::cout<<"Checa "<<i<<"\n";
for(int j=0;j!=curte[C[i]].size();++j){
auto x=curte[C[i]][j];
int ultimo_pintor = mod(x-1,M);
int ind1 = j,ind2 = get_num(C[fim],ultimo_pintor);
/// std::cout<<"Ind "<<ind2<<"\n";
if(ind2==-1)continue;
pii alpha = find({i,ind1});
pii beta = find({fim,ind2});
/// std::cout<<"Busca "<<i<<" "<<ind1<<" "<<fim<<" "<<ind2<<"\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;
}
컴파일 시 표준 에러 (stderr) 메시지
paint.cpp: In function 'int minimumInstructions(int, int, int, std::vector<int>, std::vector<int>, std::vector<std::vector<int> >)':
paint.cpp:59:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
59 | for(int j=0;j!=curte[cor1].size();++j){
| ~^~~~~~~~~~~~~~~~~~~~
paint.cpp:61:17: warning: unused variable 'tipo' [-Wunused-variable]
61 | int tipo = x,prox = mod(x+1,M);
| ^~~~
paint.cpp:91:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
91 | for(int j=0;j!=curte[C[i]].size();++j){
| ~^~~~~~~~~~~~~~~~~~~~
paint.cpp:111:9: warning: unused variable 'min' [-Wunused-variable]
111 | int min = 1e9;
| ^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |