제출 #64725

#제출 시각아이디문제언어결과실행 시간메모리
64725IvanC앵무새 (IOI11_parrots)C++17
98 / 100
20 ms2616 KiB
#include "encoder.h" #include "encoderlib.h" #include <bits/stdc++.h> using namespace std; void encode(int N, int M[]){ if(N <= 32){ int qtd_bits = 5; for(int i = 0;i<N;i++){ int copia = M[i]; for(int j = 0;j<3;j++){ int primeiro = (copia & 7); copia = copia >> 3; int enviar = (i | (primeiro << qtd_bits)); for(int k = 0;k < (1 << j);k++) send(enviar); } } } else{ vector<int> bits_mandar; for(int i = 0;i<N;i++){ for(int j = 0;j<8;j++){ if(M[i] & (1 << j)) bits_mandar.push_back(1); else bits_mandar.push_back(0); } } int nao_troca = 0,troca_sim = 0; for(int i = 0;i<bits_mandar.size();i++){ if(i & 1){ nao_troca += 2*bits_mandar[i]; troca_sim += 2*(1 - bits_mandar[i]); } else{ nao_troca += 1*bits_mandar[i]; troca_sim += 1*(1 - bits_mandar[i]); } } if(troca_sim < nao_troca){ for(int i = 0;i<bits_mandar.size();i++){ bits_mandar[i] ^= 1; } for(int i = 0;i<4;i++) send(255); } int last_sent = 0; for(int i = 0;i<bits_mandar.size();i += 2){ int manda_qnt = 0; if(bits_mandar[i]) manda_qnt++; if(bits_mandar[i+1]) manda_qnt += 2; for(int j = 0;j<manda_qnt;j++) send(last_sent); last_sent++; } } }
#include "decoder.h" #include "decoderlib.h" #include <bits/stdc++.h> using namespace std; void decode(int N, int L, int X[]){ if(N <= 32){ map<int,int> mapa[65]; int ANS[65]; memset(ANS,0,sizeof(ANS)); int qtd_bits = 5; for(int i = 0;i < L;i++){ int pos = X[i] & ((1 << qtd_bits) - 1); int outros_bits = (X[i] >> qtd_bits); mapa[pos][outros_bits]++; } for(int i = 0;i<N;i++){ for(auto it : mapa[i]){ int outros_bits = it.first,freq = it.second; if(freq & 1) ANS[i] += outros_bits; if(freq & 2) ANS[i] += outros_bits*8; if(freq & 4) ANS[i] += outros_bits*64; } } for(int i = 0;i<N;i++) output(ANS[i]); } else{ int troca = 0; vector<int> bits_recebidos,freq; freq.assign(256,0); for(int i = 0;i<8*N;i++) bits_recebidos.push_back(0); for(int i = 0;i<L;i++){ freq[X[i]]++; } if(freq[255] >= 4){ freq[255] -= 4; troca = 255; } for(int i = 0;i<freq.size();i++){ if(freq[i] & 1) bits_recebidos[2*i] = 1; if(freq[i] & 2) bits_recebidos[2*i + 1] = 1; } for(int i = 0;i<N;i++){ int numero = 0,qual_pot = 1; for(int j = 8*i;j<8*(i + 1);j++){ numero += bits_recebidos[j]*qual_pot; qual_pot *= 2; } output(numero ^ troca); } } }

컴파일 시 표준 에러 (stderr) 메시지

encoder.cpp: In function 'void encode(int, int*)':
encoder.cpp:37:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0;i<bits_mandar.size();i++){
                 ~^~~~~~~~~~~~~~~~~~~
encoder.cpp:49:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int i = 0;i<bits_mandar.size();i++){
                  ~^~~~~~~~~~~~~~~~~~~
encoder.cpp:56:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0;i<bits_mandar.size();i += 2){
                 ~^~~~~~~~~~~~~~~~~~~

decoder.cpp: In function 'void decode(int, int, int*)':
decoder.cpp:56:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int i = 0;i<freq.size();i++){
                  ~^~~~~~~~~~~~
#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...