제출 #235574

#제출 시각아이디문제언어결과실행 시간메모리
235574Coroian_David앵무새 (IOI11_parrots)C++11
0 / 100
159 ms98352 KiB
#include <bits/stdc++.h> #include "encoder.h" #include "encoderlib.h" #define MAX_N 64 using namespace std; int n; void aduna(char a[], char b[]) { int i = 1; int t = 0; for(i = 1; i <= max(a[0], b[0]) || t; i ++) { a[i] += b[i] + t; t = 0; if(a[i] > 9) { t = a[i] / 10; a[i] %= 10; } } a[0] = i - 1; } bool cmp(char a[], char b[]) { if(a[0] > b[0]) return 1; if(a[0] < b[0]) return 0; for(int i = a[0]; i >= 1; i --) { if(a[i] != b[i]) return (a[i] > b[i]); } return 1; } void copyV(char a[], char b[]) { /*for(int i = 0; i <= 199; i ++) a[i] = 0;*/ a[0] = b[0]; for(int i = 1; i <= b[0]; i ++) a[i] = b[i]; } void scade(char a[], char b[]) { int t = 0; for(int i = 1; i <= b[0] || t; i ++) { a[i] = a[i] - t - b[i]; t = 0; if(a[i] < 0) { t = 1; a[i] += 10; } } while(a[0] > 1 && a[a[0]] == 0) a[0] --; } struct nr { char v[200]; void operator +=(nr &x) { aduna(v, x.v); } void operator -=(nr &x) { scade(v, x.v); } void operator =(nr &x) { copyV(v, x.v); } bool operator >= (nr &x) { return cmp(v, x.v); } }; nr dp[255 + 1][MAX_N * 5 + 1]; nr sdp[255 + 1][MAX_N * 5 + 1]; nr mdp[255 + 1][MAX_N * 5 + 1]; nr p2; nr cod; nr s; int done; void getDp() { if(done == 1) return; done = 1; dp[0][0].v[0] = 1; dp[0][0].v[1] = 1; sdp[0][0].v[0] = 1; sdp[0][0].v[1] = 1; int n = 64; for(int i = 0; i < 255; i ++) { for(int j = 0; j <= n * 5; j ++) { if(j > 0) { sdp[i][j] += sdp[i][j - 1]; mdp[i][j] += mdp[i][j - 1]; } dp[i][j] = sdp[i][j]; dp[i][j] -= mdp[i][j]; if(dp[i][j].v[0] != 0) { sdp[i + 1][j] += dp[i][j]; if(j + 256 <= n * 5) mdp[i + 1][j + 256] += dp[i][j]; } } } } int apel; void encode(int N, int M[]) { apel ++; if(apel > 1) assert(1 == 0); n = N; getDp(); int k = 0; int a[700]; for(int i = 0; i < N; i ++) { for(int j = 7; j >= 0; j --) a[++ k] = (((1 << j) & M[i]) != 0); } p2.v[0] = 1; p2.v[1] = 1; cod.v[0] = 1; cod.v[1] = 0; for(int i = k; i >= 1; i --) { if(a[i] != 0) cod += p2; p2 += p2; } int sum = 5 * n; for(int i = 0; i <= 255; i ++) { int last = 0; for(int j = 0; j <= n * 5 && j <= sum; j ++) { //cout << " SUNTEM IN " << i << " CR " << j << "\n"; if(cod >= s) last = j; else { s -= dp[255 - i - 1][sum - last]; break; } s += dp[255 - i - 1][sum - j]; } sum -= last; for(int j = 1; j <= last; j ++) send(i); } }
#include <bits/stdc++.h> #include "decoder.h" #include "decoderlib.h" #define MAX_N 64 using namespace std; int n; void aduna(char a[], char b[]) { int i = 1; int t = 0; for(i = 1; i <= max(a[0], b[0]) || t; i ++) { a[i] += b[i] + t; t = 0; if(a[i] > 9) { t = a[i] / 10; a[i] %= 10; } } a[0] = i - 1; } bool cmp(char a[], char b[]) { if(a[0] > b[0]) return 1; if(a[0] < b[0]) return 0; for(int i = a[0]; i >= 1; i --) { if(a[i] != b[i]) return (a[i] > b[i]); } return 1; } void copyV(char a[], char b[]) { /*for(int i = 0; i <= 199; i ++) a[i] = 0;*/ a[0] = b[0]; for(int i = 1; i <= b[0]; i ++) a[i] = b[i]; } void scade(char a[], char b[]) { int t = 0; for(int i = 1; i <= b[0] || t; i ++) { a[i] = a[i] - t - b[i]; t = 0; if(a[i] < 0) { t = 1; a[i] += 10; } } while(a[0] > 1 && a[a[0]] == 0) a[0] --; } struct nr { char v[200]; void operator +=(nr &x) { aduna(v, x.v); } void operator -=(nr &x) { scade(v, x.v); } void operator =(nr &x) { copyV(v, x.v); } bool operator >= (nr &x) { return cmp(v, x.v); } }; nr dp[255 + 1][MAX_N * 5 + 1]; nr sdp[255 + 1][MAX_N * 5 + 1]; nr mdp[255 + 1][MAX_N * 5 + 1]; nr p2; nr cod; nr s; int done; void getDp() { if(done == 1) return; done = 1; dp[0][0].v[0] = 1; dp[0][0].v[1] = 1; sdp[0][0].v[0] = 1; sdp[0][0].v[1] = 1; int n = 64; for(int i = 0; i < 255; i ++) { for(int j = 0; j <= n * 5; j ++) { if(j > 0) { sdp[i][j] += sdp[i][j - 1]; mdp[i][j] += mdp[i][j - 1]; } dp[i][j] = sdp[i][j]; dp[i][j] -= mdp[i][j]; if(dp[i][j].v[0] != 0) { sdp[i + 1][j] += dp[i][j]; if(j + 256 <= n * 5) mdp[i + 1][j + 256] += dp[i][j]; } } } } nr p[600]; nr sp; nr tmp; void decode(int N, int L, int X[]) { n = N; getDp(); int ap[256]; for(int i = 0; i <= 255; i ++) ap[i] = 0; for(int i = 0; i < L; i ++) ap[X[i]] ++; memset(s.v, 0, sizeof(s.v)); int sum = 5 * n; for(int i = 0; i <= 255; i ++) { int last = 0; for(int j = 0; j < ap[i]; j ++) s += dp[255 - i - 1][sum - j]; sum -= ap[i]; } p[0].v[0] = 1; p[0].v[1] = 1; for(int i = 1; i <= 520; i ++) { p[i].v[0] = 1; p[i].v[1] = 0; p[i] += p[i - 1]; p[i] += p[i - 1]; } sp.v[0] = 1; sp.v[1] = 0; int a[600]; memset(a, 0, sizeof(a)); for(int i = n * 8 - 1; i >= 0; i --) { tmp = sp; tmp += p[i]; if(s >= tmp) { sp += p[i]; a[i] = 1; } } for(int i = n * 8 - 1; i >= 0; i -= 8) { int nr = 0; for(int x = 7, j = 0; x >= 0; x --, j ++) nr += (a[i - j] << x); output(nr); } }

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

encoder.cpp: In function 'void scade(char*, char*)':
encoder.cpp:71:29: warning: array subscript has type 'char' [-Wchar-subscripts]
     while(a[0] > 1 && a[a[0]] == 0)
                             ^

decoder.cpp: In function 'void scade(char*, char*)':
decoder.cpp:71:29: warning: array subscript has type 'char' [-Wchar-subscripts]
     while(a[0] > 1 && a[a[0]] == 0)
                             ^
decoder.cpp: In function 'void decode(int, int, int*)':
decoder.cpp:169:13: warning: unused variable 'last' [-Wunused-variable]
         int last = 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...
#Verdict Execution timeMemoryGrader output
Fetching results...