# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
798288 |
2023-07-30T14:52:44 Z |
khshg |
Parrots (IOI11_parrots) |
C++14 |
|
2000 ms |
27076 KB |
#include "encoder.h"
#include "encoderlib.h"
#include <bits/stdc++.h>
using namespace std;
const int BASE = 3333;
int LEN;
struct BIGNUM {
vector<int> d;
}dp[5 * 64][256];
BIGNUM add(const BIGNUM& A, const BIGNUM& B) {
BIGNUM res;
int C = 0;
for(int i = 0; i < max((int)A.d.size(), (int)B.d.size()) || C; ++i) {
int cur = C;
if(i < (int)A.d.size()) cur += A.d[i];
if(i < (int)B.d.size()) cur += B.d[i];
C = cur >= BASE;
if(C) cur -= BASE;
res.d.push_back(cur);
}
return res;
}
BIGNUM sub(BIGNUM A, const BIGNUM& B) {
int C = 0;
for(int i = 0; i < (int)B.d.size() || C; ++i) {
A.d[i] -= C + (i < (int)B.d.size() ? B.d[i] : 0);
C = A.d[i] < 0;
if(C) A.d[i] += BASE;
}
while((int)A.d.size() && A.d.back() == 0) A.d.pop_back();
return A;
}
BIGNUM mul(const int& A, const BIGNUM& B) {
BIGNUM res;
int C = 0;
for(int i = 0; i < (int)B.d.size() || C; ++i) {
int cur = C;
if(i < (int)B.d.size()) cur += A * B.d[i];
C = cur / BASE;
res.d.push_back(cur - C * BASE);
}
while((int)res.d.size() && res.d.back() == 0) res.d.pop_back();
return res;
}
bool cmp(const BIGNUM& A, const BIGNUM& B) {
if((int)A.d.size() != (int)B.d.size()) return (int)A.d.size() < (int)B.d.size();
for(int i = (int)A.d.size() - 1; i >= 0; --i) {
if(A.d[i] != B.d[i]) return A.d[i] < B.d[i];
}
return 0;
}
void encode(int N, int M[]) {
LEN = 5 * N;
for(int i = 0; i < 256; ++i) dp[0][i].d = {1};// ONE
for(int i = 1; i < LEN; ++i) dp[i][0].d = {1};// ONE
for(int i = 1; i < LEN; ++i) {
for(int j = 1; j < 256; ++j) {
dp[i][j] = add(dp[i][j - 1], dp[i - 1][j]);
}
}
BIGNUM val, pwi;
pwi.d = {1};
for(int i = N - 1; i >= 0; --i) {
val = add(val, mul(M[i], pwi));
if(i > 0) pwi = mul(256, pwi);
}
for(int i = LEN - 1; i >= 0; --i) {
int j;
for(j = 0; j < 256; ++j) {
if(cmp(val, dp[i][j])) {
break;
}
val = sub(val, dp[i][j]);
}
send(j);
}
}
#include "decoder.h"
#include "decoderlib.h"
#include <bits/stdc++.h>
using namespace std;
const int BASE = 3333;
int LEN;
struct BIGNUM {
vector<int> d;
}dp[5 * 64][256];
BIGNUM add(const BIGNUM& A, const BIGNUM& B) {
BIGNUM res;
int C = 0;
for(int i = 0; i < max((int)A.d.size(), (int)B.d.size()) || C; ++i) {
int cur = C;
if(i < (int)A.d.size()) cur += A.d[i];
if(i < (int)B.d.size()) cur += B.d[i];
C = cur >= BASE;
if(C) cur -= BASE;
res.d.push_back(cur);
}
return res;
}
BIGNUM sub(BIGNUM A, const BIGNUM& B) {
int C = 0;
for(int i = 0; i < (int)B.d.size() || C; ++i) {
A.d[i] -= C + (i < (int)B.d.size() ? B.d[i] : 0);
C = A.d[i] < 0;
if(C) A.d[i] += BASE;
}
while((int)A.d.size() && A.d.back() == 0) A.d.pop_back();
return A;
}
BIGNUM mul(const int& A, const BIGNUM& B) {
BIGNUM res;
int C = 0;
for(int i = 0; i < (int)B.d.size() || C; ++i) {
int cur = C;
if(i < (int)B.d.size()) cur += A * B.d[i];
C = cur / BASE;
res.d.push_back(cur - C * BASE);
}
while((int)res.d.size() && res.d.back() == 0) res.d.pop_back();
return res;
}
bool cmp(const BIGNUM& A, const BIGNUM& B) {
if((int)A.d.size() != (int)B.d.size()) return (int)A.d.size() < (int)B.d.size();
for(int i = (int)A.d.size() - 1; i >= 0; --i) {
if(A.d[i] != B.d[i]) return A.d[i] < B.d[i];
}
return 0;
}
void decode(int N, int L, int X[]) {
LEN = 5 * N;
sort(X, X + L);
for(int i = 0; i < 256; ++i) dp[0][i].d = {1};// ONE
for(int i = 1; i < LEN; ++i) dp[i][0].d = {1};// ONE
for(int i = 1; i < LEN; ++i) {
for(int j = 1; j < 256; ++j) {
dp[i][j] = add(dp[i][j - 1], dp[i - 1][j]);
}
}
BIGNUM val;
for(int i = LEN - 1; i >= 0; --i) {
for(int j = 0; j < X[i]; ++j) val = add(val, dp[i][j]);
}
vector<BIGNUM> p(N);
p[0].d = {1};
for(int i = 1; i < N; ++i) {
p[i] = mul(256, p[i - 1]);
}
for(int i = N - 1; i >= 0; --i) {
int L = 0, R = 255;
while(L < R) {
int M = (L + R + 1) / 2;
if(cmp(val, mul(M, p[i]))) {
R = M - 1;
} else {
L = M;
}
}
output(L);
val = sub(val, mul(L, p[i]));
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
30 ms |
5516 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
137 ms |
5844 KB |
Output is correct |
2 |
Correct |
218 ms |
6516 KB |
Output is correct |
3 |
Correct |
341 ms |
7308 KB |
Output is correct |
4 |
Correct |
369 ms |
7712 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
138 ms |
6068 KB |
Output is correct |
2 |
Correct |
214 ms |
6460 KB |
Output is correct |
3 |
Correct |
341 ms |
7464 KB |
Output is correct |
4 |
Correct |
368 ms |
7616 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
139 ms |
5892 KB |
Output is correct |
2 |
Correct |
371 ms |
7700 KB |
Output is correct |
3 |
Correct |
512 ms |
8820 KB |
Output is correct |
4 |
Correct |
919 ms |
12100 KB |
Output is correct |
5 |
Correct |
962 ms |
12416 KB |
Output is correct |
6 |
Correct |
1008 ms |
12664 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
373 ms |
7772 KB |
Output is correct - P = 5.000000 |
2 |
Correct |
1012 ms |
12612 KB |
Output is correct - P = 5.000000 |
3 |
Correct |
1064 ms |
13216 KB |
Output is correct - P = 5.000000 |
4 |
Correct |
1983 ms |
20092 KB |
Output is correct - P = 5.000000 |
5 |
Execution timed out |
2178 ms |
25076 KB |
Time limit exceeded |
6 |
Execution timed out |
2262 ms |
26808 KB |
Time limit exceeded |
7 |
Execution timed out |
2288 ms |
27076 KB |
Time limit exceeded |