이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "encoder.h"
#include "encoderlib.h"
//#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using arr = array<int, 2>;
using arrr = array<int, 3>;
/*
Can maybe send one bit from each number
The zeroth bit sent once
The first bit sent twice
THe third bit sent three times
.
.
.
Sending 8 bit numbers
3 for the exact bit placement
3 for telling which group
2 for telling the actual bits
*/
/*
For 32/64
Have the first 5 bits tell the position, and then send three bits
Send one message for the first three bits, two identical messages for the next three bits
Need to have different cases for n = 64, and n = 32
We need to specify the position by sending it a power of two number of times, then we can distingluish
copies
1+2+4+8 = 15, which is correct for n = 64,
but for n = 32
we need 1 + 2 +4, which means that only the first 5 bits can be used for position
*/
void encode(int n, int M[])
{
if (n <= 32)
{
int out;
for (int i = 0; i < n; i++)
{
for (int y = 0; y < 8; y += 3)
{
out = (i << 3);
out |= __builtin_popcount(M[i] & (1 << y));
out |= __builtin_popcount(M[i] & (1 << (y + 1))) << 1;
if (y != 6) out |= __builtin_popcount(M[i] & (1 << (y + 2))) << 2;
for (int x = 0; x < (1 << (y / 3) ); x++) {
send(out);
// cout << bitset<8>(out) << "\n";
}
}
}
}
}
// void encode(int n, int M[])
// {
// int groups = (n + 1) / 2;
// for (int g = 0; g < groups; g++)
// {
// int out = (g << 5);
// cout << out << "\n";
// for (int b = 0; b < 8; b++)
// {
// out |= (b << 2);
// cout << " " << out << "\n";
// out |= ((M[g * 2] & (1 << b)) >> (b - 1));
// cout << " " << out << "\n";
// out |= ((M[g * 2 + 1] & (1 << b)) >> b);
// cout << " " << out << "\n";
// }
// }
// }
#include "decoder.h"
#include "decoderlib.h"
//#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using arr = array<int, 2>;
using arrr = array<int, 3>;
using pii = pair<int, int>;
void decode(int n, int l, int x[])
{
map<int, int> m;
for (int i = 0; i < l; i++)
{
if (m.count(x[i])) m[x[i]]++;
else m[x[i]] = 1;
}
auto it = m.begin();
int c = 0;
int ou = 0;
pii p;
while (it != m.end())
{
p = *it++;
p.first &= 7;
if (p.second & 1) {
ou |= p.first;
c++;
}
if (p.second & 2)
{
ou |= (p.first << 3);
c++;
}
if (p.second & 4) {
ou |= (p.first << 6);
c++;
}
if (c == 3) {
// cout << "output: " << ou << "\n";
output(ou);
ou = 0;
c = 0;
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |