제출 #509632

#제출 시각아이디문제언어결과실행 시간메모리
509632HappyPacMan앵무새 (IOI11_parrots)C++14
81 / 100
2489 ms197324 KiB
#include "encoder.h" #include "encoderlib.h" #include <bits/stdc++.h> using namespace std; int curr[65],comb[65][1500][257]; void encode(int N, int M[]){ memset(curr,0,sizeof(curr)); memset(comb,0,sizeof(comb)); for(int i=0;i<N;i++) curr[i] = M[i]; auto valid = [&](int i,int j){ for(int k=65;k>0;k--){ if(comb[k-1][i][j] > curr[k-1]) return true; else if(comb[k-1][i][j] < curr[k-1]) return false; } return false; }; for(int i=1;i<257;i++) comb[0][0][i] = 1; int maxx = 1; for(int i=1;i<1500;i++){ bool v = false; for(int j=1;j<257;j++){ for(int k=0;k<65;k++){ comb[k][i][j] += comb[k][i-1][j]+comb[k][i][j-1]; if(k != 64) comb[k+1][i][j] += comb[k][i][j]/256; comb[k][i][j] %= 256; } if(valid(i,j)){ v = true; break; } } if(v) break; maxx++; } for(int i=maxx;i>0;i--){ for(int j=1;j<257;j++){ if(valid(i,j)){ send(j-1); for(int k=0;k<65;k++){ curr[k] -= comb[k][i][j-1]; if(curr[k] < 0){ int left = (255-curr[k])/256; if(k != 64) curr[k+1] -= left; curr[k] += 256*left; } } break; } } } }
#include "decoder.h" #include "decoderlib.h" #include <bits/stdc++.h> using namespace std; int ans[65],temp[65][1500][257]; void decode(int N, int L, int X[]){ memset(ans,0,sizeof(ans)); memset(temp,0,sizeof(temp)); sort(X,X+L); for(int i=1;i<257;i++) temp[0][0][i] = 1; for(int i=1;i<=L;i++){ for(int j=1;j<257;j++){ for(int k=0;k<65;k++){ temp[k][i][j] += temp[k][i-1][j]+temp[k][i][j-1]; if(k != 64) temp[k+1][i][j] += temp[k][i][j]/256; temp[k][i][j] %= 256; } } for(int k=0;k<65;k++){ ans[k] += temp[k][i][X[i-1]]; if(k != 64) ans[k+1] += ans[k]/256; ans[k] %= 256; } } for(int i=0;i<N;i++) output(ans[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...