이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "grader.h"
#include "encoder.h"
///Encoder
#define MAX 1005
std::vector<int> con[MAX];
int origem[MAX];
void encode_bit(int b);
bool foi[MAX];
void explora(int pos,int prev){
if(foi[pos])return;
if(!prev)origem[0]=pos;
origem[pos]=prev;
foi[pos]=true;
for(auto&x:con[pos])explora(x,pos);
}
int count=0;
void codifica(int x,int vals){
// std::cout<<"Hardcoded "<<x<<"\n";
std::deque<int> dek;
while(x){
dek.push_front(x&1);
x/=2;
}
while(dek.size()!=vals)dek.push_front(0);
for(auto&x:dek){++count;encode_bit(x);}
}
typedef std::pair<int,int> pii;
void encode(int nv, int nh, int ne, int *v1, int *v2){
for(int i=0;i!=ne;++i){
con[v1[i]].push_back(v2[i]);
con[v2[i]].push_back(v1[i]);
}
explora(0,-1);
for(int i=1;i!=nv;++i){
codifica(origem[i],10);
}
int dists[MAX][36]={};
for(int i=0;i!=36;++i){
std::queue<pii> queue;
queue.push({i,0});
bool foi[MAX]={};
if(i<nh)
while(queue.size()){
auto __ = queue.front();
queue.pop();
auto pos=__.first,dist=__.second;
if(foi[pos])continue;
foi[pos]=true;
dists[pos][i]=dist;
for(auto&x:con[pos])queue.push({x,dist+1});
}
}
// std::cout<<"ta\n";
for(int i=0;i!=nv;++i){
int base=0;
int count=0;
for(int j=0;j!=36;++j){
// std::cout<<"tek" <<i<<"\n";
int dif = dists[i][j]-dists[origem[i]][j]+1;
/// std::cout<<dists[i][j]<<" "<<dists[origem[i]][j]<<"!\n";
base*=3;base+=dif;
/// if(j<nh+3)
/// std::cout<<"Dif "<<i<<" "<<dif<<"\n";
++count;
if(count==6){
count=0;
/// std::cout<<"Escreveu "<<base<<"\n";
codifica(base,10);
base=0;
}
}
assert(count==0);
//std::cout<<"show" <<i<<" "<<base<<"\n";
// std::cout<<"blz" <<i<<"\n";
}
//std::cout<<"ok\n";
}
///Decoder
#include <bits/stdc++.h>
#include "grader.h"
#include "encoder.h"
#define MAX 1005
int decode_bit();
void hops(int a, int b, int d);
int recebe(int x){
int base=0;
for(int i=0;i!=x;++i){
base*=2;
base+=decode_bit();
}
return base;
}
std::vector<int> conexao[MAX];
int pai[MAX];
int diferencas[MAX][40];
void calcular(int pos,int prev,int dist,int hub){
hops(hub,pos,dist);
for(auto&x:conexao[pos]){
if(x==prev)continue;
if(x==pai[pos])
calcular(x,pos,dist-(diferencas[pos][hub]),hub);
else{
calcular(x,pos,dist+(diferencas[x][hub]),hub);
}
}
}
void decode(int N, int H){
for(int i=1;i!=N;++i){
int a = recebe(10);
// std::cout<<"Lido "<<a<<"\n";
int b = i;
conexao[a].push_back(b);
conexao[b].push_back(a);
pai[b]=a;
}
// std::cout<<"ok\n";
for(int i=0;i!=N;++i){
for(int j=0;j!=6;++j){
int base=recebe(10);
/// std::cout<<"Leu "<<base<<"\n";
std::deque<int> nos;
for(int i=0;i!=6;++i){nos.push_back(base%3);///std::cout<<"Resta "<<base<<" "<<base%3<<"\n";
base/=3;}
std::reverse(nos.begin(),nos.end());
for(int k=0;k!=6;++k){
int val = nos[k];
int pos = (j*6)+k;
///if(pos<H)
/// std::cout<<"RDif "<<i<<" "<<val<<"\n";
diferencas[i][pos]=val-1;
}
}
}
// std::cout<<"ok\n";
for(int i=0;i!=H;++i)calcular(i,-1,0,i);
}
컴파일 시 표준 에러 (stderr) 메시지
encoder.cpp: In function 'void codifica(int, int)':
encoder.cpp:29:21: warning: comparison of integer expressions of different signedness: 'std::deque<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
29 | while(dek.size()!=vals)dek.push_front(0);
| ~~~~~~~~~~^~~~~~
# | 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... |