제출 #570452

#제출 시각아이디문제언어결과실행 시간메모리
570452Deepesson저장 (Saveit) (IOI10_saveit)C++17
100 / 100
548 ms14212 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...