(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

Submission #957660

#TimeUsernameProblemLanguageResultExecution timeMemory
957660nguyentunglamAlice, Bob, and Circuit (APIO23_abc)C++17
66 / 100
81 ms9800 KiB
#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 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...