This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "abc.h"
#include<bits/stdc++.h>
using namespace std;
// you may find the definitions useful
const int OP_ZERO = 0; // f(OP_ZERO, x0, x1) = 0
const int OP_NOR = 1; // f(OP_NOR, x0, x1) = !(x0 || x1)
const int OP_GREATER = 2; // f(OP_GREATER, x0, x1) = (x0 > x1)
const int OP_NOT_X1 = 3; // f(OP_NOT_X1, x0, x1) = !x1
const int OP_LESS = 4; // f(OP_LESS, x0, x1) = (x0 < x1)
const int OP_NOT_X0 = 5; // f(OP_NOT_X0, x0, x1) = !x0
const int OP_XOR = 6; // f(OP_XOR, x0, x1) = (x0 ^ x1)
const int OP_NAND = 7; // f(OP_NAND, x0, x1) = !(x0 && x1)
const int OP_AND = 8; // f(OP_AND, x0, x1) = (x0 && x1)
const int OP_EQUAL = 9; // f(OP_EQUAL, x0, x1) = (x0 == x1)
const int OP_X0 = 10; // f(OP_X0, x0, x1) = x0
const int OP_GEQ = 11; // f(OP_GEQ, x0, x1) = (x0 >= x1)
const int OP_X1 = 12; // f(OP_X1, x0, x1) = x1
const int OP_LEQ = 13; // f(OP_LEQ, x0, x1) = (x0 <= x1)
const int OP_OR = 14; // f(OP_OR, x0, x1) = (x0 || x1)
const int OP_ONE = 15; // f(OP_ONE, x0, x1) = 1
// Alice
int // returns la
alice(
/* in */ const int n,
/* in */ const char names[][5],
/* in */ const unsigned short numbers[],
/* out */ bool outputs_alice[]
) {
if (n == 1) {
for(int i = 0; i < 16; i++) outputs_alice[i] = numbers[0] >> i & 1;
for(int i = 16; i < 32; i++) outputs_alice[i] = 0;
return 32;
}
vector<pair<string, int> > arr;
for(int i = 0; i < n; i++) {
arr.emplace_back(names[i], i);
}
sort(arr.begin(), arr.end());
int cnt = 16;
for(int i = 0; i < 16; i++) outputs_alice[i] = 0;
for(auto &[str, idx] : arr) {
for(int j = 0; j < 16; j++) outputs_alice[cnt++] = numbers[idx] >> j & 1;
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) outputs_alice[cnt++] = i == arr[j].second;
}
// for(int i = 48; i < cnt; i++) cout << outputs_alice[i];
// exit(0);
return cnt;
}
// Bob
int // returns lb
bob(
/* in */ const int m,
/* in */ const char senders[][5],
/* in */ const char recipients[][5],
/* out */ bool outputs_bob[]
) {
vector<string> arr;
for(int i = 0; i < m; i++) {
arr.push_back(senders[i]);
arr.push_back(recipients[i]);
}
sort(arr.begin(), arr.end());
arr.resize(unique(arr.begin(), arr.end()) - arr.begin());
int n = arr.size();
if (n == 1) return m;
auto idx = [&] (string tmp) {
return lower_bound(arr.begin(), arr.end(), tmp) - arr.begin();
};
vector<vector<int> > send(n + 1, vector<int> (n + 1));
for(int i = 0; i < m; i++) {
int x = idx(senders[i]);
int y = idx(recipients[i]);
send[x][y] = 1;
}
int cnt = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
outputs_bob[cnt++] = send[i][j];
}
}
return cnt;
}
// Circuit
int // returns l
circuit(
/* in */ const int la,
/* in */ const int lb,
/* out */ int operations[],
/* out */ int operands[][2],
/* out */ int outputs_circuit[][16]
) {
int cnt = la + lb;
auto calc = [&] (vector<int> a, vector<int> b) {
vector<int> ret;
assert(a.size() == 16 && b.size() == 16);
int c = 0;
for(int i = 0; i < 16; i++) {
operations[cnt] = 6;
operands[cnt][0] = a[i];
operands[cnt][1] = b[i];
int sum1 = cnt++;
operations[cnt] = 8;
operands[cnt][0] = a[i];
operands[cnt][1] = b[i];
int rem1 = cnt++;
if (i == 0) {
c = rem1;
ret.push_back(sum1);
continue;
}
operations[cnt] = 6;
operands[cnt][0] = sum1;
operands[cnt][1] = c;
int sum2 = cnt++;
ret.push_back(sum2);
if (i == 15) return ret;
operations[cnt] = 8;
operands[cnt][0] = sum1;
operands[cnt][1] = c;
int rem2 = cnt++;
operations[cnt] = 14;
operands[cnt][0] = rem1;
operands[cnt][1] = rem2;
c = cnt++;
}
return ret;
};
if (la == 32) {
vector<int> init;
for(int i = 0; i < 16; i++) init.push_back(i);
vector<int> cur;
for(int i = 16; i < 32; i++) cur.push_back(i);
for(int loop = 0; loop < lb; loop++) {
cur = calc(cur, init);
}
for(int j = 0; j < 16; j++) outputs_circuit[0][j] = cur[j];
return cnt;
}
int n = 1;
while (16 + 16 * n + n * n < la) n++;
vector<vector<int> > a(n, vector<int> (16));
vector<vector<int> > answer(n, vector<int> (16));
vector<int> zero;
for(int j = 0; j < 16; j++) zero.push_back(j);
int alice_cnt = 16;
for(int i = 0; i < n; i++) {
a[i].clear();
for(int j = 0; j < 16; j++) a[i].push_back(alice_cnt++);
}
for(int i = 0; i < n; i++) answer[i] = zero;
int bob_cnt = la;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
vector<int> tmp;
for(int k = 0; k < 16; k++) {
operations[cnt] = 8;
operands[cnt][0] = bob_cnt;
operands[cnt][1] = a[i][k];
tmp.push_back(cnt++);
}
bob_cnt++;
answer[j] = calc(answer[j], tmp);
}
}
//
// for(int i = 0; i < n; i++) {
// for(int j = 0; j < 16; j++) cout << answer[i][j] << " "; cout << endl;
// }
// cout << alice_cnt << endl;
// for(int i = 0; i < n; i++) {
// for(int j = 0; j < 16; j++) outputs_circuit[i][j] = answer[i][j];
// }
for(int i = 0; i < n; i++) {
vector<int> cur = zero;
for(int j = 0; j < n; j++) {
vector<int> tmp;
for(int k = 0; k < 16; k++) {
operations[cnt] = 8;
operands[cnt][0] = alice_cnt;
operands[cnt][1] = answer[j][k];
tmp.push_back(cnt++);
}
alice_cnt++;
cur = calc(cur, tmp);
}
for(int j = 0; j < 16; j++) outputs_circuit[i][j] = cur[j];
}
return cnt;
}
# | 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... |
# | 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... |