#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int prob = 1;
#include "communication.h"
int dec3(int x)//4 bit x
{
vector<int>ger;
for (int m = 0; m < 16; m++)
{
bool ok = true;
int v = m;
while (v != 0)
{
if (v % 4 == 3)
ok = false;
v /= 2;
}
if (ok)
ger.push_back(m);
}
int V[4] = {0, 0, 6, 9};
for (int i = 1; i <= 3; i++)
{
bool ok = true;
for (int j : ger)
if (x == (V[i] ^ j))
ok = false;
if (ok)
return i;
}
assert(false);
return 0;
}
int enc3(int X)
{
int v = 0;
if (X == 1)
v = 0;
else if (X == 2)
v = 6;
else if (X == 3)
v = 9;
int val = 0;
for (int t = 0; t < 4; t++)
{
val += send(v % 2) << t;
v /= 2;
}
return dec3(val);
}
string S4[4] = {"1000",
"0001",
"1110",
"0111"
};
int conv4(int i)
{
int v = 0;
int p = 1;
for (char c : S4[i])
{
if (c == '1')
v += p;
p *= 2;
}
return v;
}
bitset<4> dec4(int x)//4 bit x
{
vector<int>ger;
for (int m = 0; m < 16; m++)
{
bool ok = true;
int v = m;
while (v != 0)
{
if (v % 4 == 3)
ok = false;
v /= 2;
}
if (ok)
ger.push_back(m);
}
bitset<4>ret;
for (int i = 0; i < 4; i++)
{
for (int j : ger)
if (x == (conv4(i) ^ j))
ret[i] = true;
}
return ret;
}
bitset<4> enc4(int X)
{
int v = conv4(X);
int val = 0;
for (int t = 0; t < 4; t++)
{
val += (send(v % 2) << t);
v /= 2;
}
auto ret = dec4(val);
assert(ret[X] == true);
return ret;
}
const int bitcnt = 10;
int bitcnt1 = 10;
bitset < 1 << bitcnt > decB(int x) //4 bit x
{
vector<int>ger;
for (int m = 0; m < (1 << bitcnt1); m++)
{
bool ok = true;
int v = m;
while (v != 0)
{
if (v % 4 == 3)
ok = false;
v /= 2;
}
if (ok)
ger.push_back(m);
}
bitset < 1 << bitcnt > ret;
int s = 0;
int i = 0;
function<void(bool)>f = [&](bool gal)
{
if (i == bitcnt1)
{
ret[x ^ s] = true;
}
else
{
int del = 1 << i;
i++;
if (gal)
{
f(true);
s += del;
f(false);
s -= del;
}
else
f(true);
i--;
}
};
f(true);
return ret;
}
bitset < 1 << bitcnt > encB(int v)
{
int val = 0;
int vv = v;
for (int t = 0; t < bitcnt1; t++)
{
val += (send(v % 2) << t);
v /= 2;
}
auto ret = decB(val);
assert(ret[vv] == true);
return ret;
}
void encode(int N, int X)
{
if (N < 3)
return;
if (N == 3)
{
enc3(X);
return;
}
for (int bc = 10; bc >= 5; bc--)
if (N > (1 << bc))
{
while (N % (1 << bc) != 0)
N++;
int v = N / (1 << bc);
int vv = (X - 1) / v;
vv = min(vv, (1 << bc) - 1);
bitcnt1 = bc;
bitset < (1 << bitcnt) > gal = encB(vv);
int s = 0;
for (int i = 0; i < (1 << bc); i++)
{
if (gal[i])
s += v;
else if (i < vv)
X -= v;
}
encode(s, X);
return;
}
if (N >= 4)
{
while (N % 4 != 0)
N++;
int v = N / 4;
int vv = (X - 1) / v;
vv = min(vv, 3);
bitset<4>gal = enc4(vv);
int s = 0;
for (int i = 0; i < 4; i++)
{
if (gal[i])
{
s += v;
}
else if (i < vv)
X -= v;
}
encode(s, X);
return;
}
}
pair<int, int> decode(int N)
{
if (N == 1)
return {1, 1};
if (N == 2)
return {1, 2};
if (N == 3)
{
int val = 0;
for (int t = 0; t < 4; t++)
val += receive() << t;
int v = dec3(val);
pair<int, int>ans = {1, 2};
if (v == 1)
ans.first = 3;
if (v == 2)
ans.second = 3;
return ans;
}
for (int bc = 10; bc >= 5; bc--)
if (N > (1 << bc))
{
int N1 = N;
while (N % (1 << bc) != 0)
N++;
int re = 0;
for (int t = 0; t < bc; t++)
re += receive() << t;
bitcnt1 = bc;
bitset < (1 << bitcnt) > gal = decB(re);
int v = N / (1 << bc);
int s = 0;
for (int i = 0; i < (1 << bc); i++)
if (gal[i])
s += v;
pair<int, int>r = decode(s);
int sum = 0;
bool ger1 = false;
bool ger2 = false;
for (int i = 0; i < (1 << bc); i++)
{
if (gal[i])
{
if (r.first > sum && r.first <= sum + v && ger1 == false)
{
for (int j = 0; j < i; j++)
{
if (gal[j] == false)
r.first += v;
}
ger1 = true;
}
if (r.second > sum && r.second <= sum + v && ger2 == false)
{
for (int j = 0; j < i; j++)
{
if (gal[j] == false)
r.second += v;
}
ger2 = true;
}
sum += v;
}
}
r.first = min(r.first, N1);
r.second = min(r.second, N1);
return r;
}
if (N >= 4)
{
int N1 = N;
while (N % 4 != 0)
N++;
int re = 0;
for (int t = 0; t < 4; t++)
re += receive() << t;
bitset<4> gal = dec4(re);
int v = N / 4;
int s = 0;
for (int i = 0; i < 4; i++)
if (gal[i])
s += v;
pair<int, int>r = decode(s);
int sum = 0;
bool ger1 = false;
bool ger2 = false;
for (int i = 0; i < 4; i++)
{
if (gal[i])
{
if (r.first > sum && r.first <= sum + v && ger1 == false)
{
for (int j = 0; j < i; j++)
if (gal[j] == false)
r.first += v;
ger1 = true;
}
if (r.second > sum && r.second <= sum + v && ger2 == false)
{
for (int j = 0; j < i; j++)
if (gal[j] == false)
r.second += v;
ger2 = true;
}
sum += v;
}
}
r.first = min(r.first, N1);
r.second = min(r.second, N1);
return r;
}
return { -1, -1};
}
// int main()
// {
// for (int t = 0; t < 1000; t++)
// {
// int N = 1e9;
// int val = (t % N) + 1;
// encode(N, val);
// pair<int, int>v = decode(N);
// cout << v.first << " " << v.second << endl;
// assert(v.first == val || v.second == val);
// }
// }
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
1768 KB |
Output is correct |
2 |
Correct |
12 ms |
1764 KB |
Output is correct |
3 |
Correct |
17 ms |
1772 KB |
Output is correct |
4 |
Correct |
11 ms |
1684 KB |
Output is correct |
5 |
Correct |
16 ms |
1744 KB |
Output is correct |
6 |
Correct |
30 ms |
1804 KB |
Output is correct |
7 |
Correct |
42 ms |
1664 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Partially correct |
738 ms |
1716 KB |
Output is partially correct |
2 |
Partially correct |
450 ms |
1776 KB |
Output is partially correct |
3 |
Partially correct |
661 ms |
1772 KB |
Output is partially correct |
4 |
Partially correct |
1064 ms |
1832 KB |
Output is partially correct |
5 |
Partially correct |
817 ms |
1768 KB |
Output is partially correct |
6 |
Partially correct |
695 ms |
1772 KB |
Output is partially correct |
7 |
Partially correct |
2715 ms |
1912 KB |
Output is partially correct |
8 |
Partially correct |
4275 ms |
2236 KB |
Output is partially correct |
9 |
Partially correct |
3636 ms |
1964 KB |
Output is partially correct |
10 |
Partially correct |
3806 ms |
2068 KB |
Output is partially correct |
11 |
Partially correct |
3985 ms |
2072 KB |
Output is partially correct |
12 |
Partially correct |
3856 ms |
1892 KB |
Output is partially correct |
13 |
Partially correct |
3715 ms |
1936 KB |
Output is partially correct |
14 |
Partially correct |
3857 ms |
1884 KB |
Output is partially correct |
15 |
Partially correct |
2069 ms |
2008 KB |
Output is partially correct |
16 |
Partially correct |
4121 ms |
1728 KB |
Output is partially correct |
17 |
Partially correct |
995 ms |
1924 KB |
Output is partially correct |
18 |
Partially correct |
1018 ms |
1972 KB |
Output is partially correct |
19 |
Partially correct |
975 ms |
1840 KB |
Output is partially correct |
20 |
Partially correct |
1053 ms |
1824 KB |
Output is partially correct |
21 |
Partially correct |
1082 ms |
1848 KB |
Output is partially correct |
22 |
Partially correct |
971 ms |
1896 KB |
Output is partially correct |
23 |
Partially correct |
1684 ms |
1932 KB |
Output is partially correct |
24 |
Correct |
10 ms |
1704 KB |
Output is correct |
25 |
Correct |
14 ms |
1696 KB |
Output is correct |
26 |
Correct |
14 ms |
1720 KB |
Output is correct |
27 |
Correct |
10 ms |
1712 KB |
Output is correct |
28 |
Correct |
11 ms |
1760 KB |
Output is correct |
29 |
Correct |
28 ms |
1860 KB |
Output is correct |
30 |
Correct |
42 ms |
1668 KB |
Output is correct |