This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/* For the advisor */
#include <bits/stdc++.h>
void WriteAdvice(unsigned char a);
#define MAX 505000
bool conselho[MAX];
int local[MAX],menciona[MAX];
typedef std::pair<int,int> pii;
void ComputeAdvice(int *C, int N, int K, int M) {
// std::cout<<"Show"<<std::endl;
std::map<int,std::deque<int>> mapa;
for(int i=0;i!=N;++i){
mapa[C[i]].push_back(i);
}
for(auto&x:local)x=-1;
std::priority_queue<pii> queue;
for(int i=0;i!=K;++i){
int x=1e9;
if(mapa[i].size())x=mapa[i].front();
queue.push({x,i});
local[i]=x;
menciona[i]=i;
}
// std::cout<<"blz"<<std::endl;
///Menciona -> Guarda a cordenada da instrucao q menciona
///Local -> Diz o proximo valor da queue
for(int i=0;i!=N;++i){
int quer = C[i];
///A cor esta no andaime
if(local[quer]!=-1){
///Registra que tem que manter a cor do cara anterior
conselho[menciona[quer]]=1;
///Anda com a cor atual
mapa[quer].pop_front();
///Pega a proxima cor atual
int x=1e9;
if(mapa[quer].size())x=mapa[i].front();
///Joga na queue
queue.push({x,i});
///Atualiza o local
local[quer]=x;
///Gera a cord
menciona[quer]=i+K;
continue;
}
///Procurar cor mais distante
int cord = -1;
while(queue.size()){
auto __ = queue.top();
queue.pop();
if(__.first!=local[__.second])continue;
cord=__.second;
break;
}
///Anda com a cor atual
mapa[quer].pop_front();
///Pega a proxima cor atual
int x=1e9;
if(mapa[quer].size())x=mapa[i].front();
///Joga na queue
queue.push({x,i});
///Atualiza o local
local[quer]=x;
///Zera a cord (nao existe mais)
local[cord]=-1;
///Gera a cord
menciona[quer]=i+K;
}
// std::cout<<"Ok envia:"<<std::endl;
for(int i=0;i!=N+K;++i){
// std::cout<<" "<<conselho[i]<<" ";
WriteAdvice(conselho[i]);
}
// std::cout<<std::endl;
}
/* For the player */
#include <bits/stdc++.h>
int GetRequest();
void PutBack(int T);
void Assist(unsigned char *A, int N, int K, int R) {
std::map<int,int> paleta;
std::vector<int> lixo;
for(int i=0;i!=K;++i){
paleta[i]=i+1;
if(!A[i])lixo.push_back(i);
}
// std::cout<<"Ok recebe:"<<std::endl;
for(int i=0;i!=N+K;++i){
// std::cout<<" "<<(int)A[i]<<" ";
}
// std::cout<<std::endl;
for(int i=0;i!=N;++i){
int x = GetRequest();
// std::cout<<"Recebe "<<x<<" "<<(int)A[i+K]<<std::endl;
if(paleta[x]){
// std::cout<<"Ja tem :)"<<std::endl;
if(!(A[i+K])){
lixo.push_back(paleta[x]-1);
paleta[x]=0;
}
}else {
int b = lixo.back();
lixo.pop_back();
PutBack(b);
if(A[i+K])
paleta[x]=b+1;
else lixo.push_back(x);
}
}
}
# | 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... |