(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 #970478

#TimeUsernameProblemLanguageResultExecution timeMemory
970478antonAlice, Bob, and Circuit (APIO23_abc)C++17
62 / 100
118 ms10728 KiB
#include "abc.h" #include<bits/stdc++.h> #define pii pair<int, int> 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[] ) { map<string, int> mn; for(int i = 0;i<n; i++){ mn[names[i]]=0; } int k = 0; for(auto e: mn){ mn[e.first] = k; k++; } auto cmp = [&](pair<string, pii>& lh, pair<string, pii>& rh){ return mn[lh.first]<mn[rh.first]; }; vector<pair<string, pii>> vp; for(int i = 0; i<n; i++){ vp.push_back({names[i], {i, numbers[i]}}); } sort(vp.begin(), vp.end(), cmp); for(int j = 0; j<n; j++){ for(int i = 0; i<16; i++){ if((1<<i) & numbers[j]){ outputs_alice[j*16 + i] = true; } } } for(int j = 0; j<n; j++){ outputs_alice[n*16 +j*30 +vp[j].second.first] = true; } return n*16 + n*30; //return numbers[0]; } // Bob int // returns lb bob( /* in */ const int m, /* in */ const char senders[][5], /* in */ const char recipients[][5], /* out */ bool outputs_bob[] ) { map<string, int> mn; for(int i = 0;i<m; i++){ mn[senders[i]]=0; mn[recipients[i]]=0; } int k = 0; for(auto e: mn){ mn[e.first] = k; k++; } auto cmp = [&](pair<string, int>& lh, pair<string, int>& rh){ return mn[lh.first]<mn[rh.first]; }; vector<pair<string, int>> vp; for(auto e: mn){ vp.push_back({e.first, e.second}); } vector<vector<bool>> oc(mn.size(), vector<bool>(mn.size())); int n = mn.size(); for(int i = 0; i<m; i++){ oc[mn[recipients[i]]][mn[senders[i]]] = true; } for(int i = 0; i<n; i++){ for(int j = 0; j<n; j++){ outputs_bob[i*n +j] = oc[i][j]; } } return n*n; } int OP(int a, int b,int tp, int&top, int op[], int operands[][2]){ op[top] = tp; operands[top][0] = a; operands[top][1] = b; return top++; } void add_bits( int carry, deque<int>& lh, deque<int>& rh, deque<int>& dest, int& top, int op[], int operands[][2]){ if(carry == -1){ int l = lh.front(); lh.pop_front(); int r= rh.front(); rh.pop_front(); dest.push_back(OP(l, r, OP_XOR, top, op, operands)); if(lh.size()>0){ add_bits(OP(l, r, OP_AND, top, op, operands), lh, rh, dest, top ,op, operands); } } else{ int l = lh.front(); lh.pop_front(); int r= rh.front(); rh.pop_front(); dest.push_back(OP(carry, OP(l, r, OP_XOR, top, op, operands), OP_XOR, top, op, operands)); if(lh.size()>0){ int ab = OP(l, r, OP_AND, top, op, operands); int bc = OP(r, carry, OP_AND, top, op, operands); int ac = OP(l, carry, OP_AND, top, op, operands); add_bits(OP(ab, OP(bc, ac, OP_OR, top, op, operands), OP_OR, top, op, operands), lh,rh, dest, top ,op, operands); } } } void add(deque<int> lh, deque<int>rh, deque<int>& dest, int& top, int op[], int operands[][2]){ add_bits(-1, lh, rh, dest, top ,op, operands); } int SQR(int v){ int i = 1; for(; i*i<v; i++){ } return i; } // 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 n = SQR(lb); int top = la+lb; vector<deque<int>>addend(n); for(int rank = 0; rank<n; rank++){ deque<int> rank_base; for(int i = 0; i<16; i++){ rank_base.push_back(OP(0, 0, OP_ZERO, top, operations, operands)); } for(int id = 0;id<n; id++){ for(int j = 0; j<16; j++) rank_base[j] = OP(rank_base[j], OP(id*16 + j, n*16 + rank*30 + id,OP_AND, top, operations, operands), OP_XOR, top, operations, operands); } addend[rank] = rank_base; } vector<deque<int>> bases(n); //cout<<"one conversion done"<<endl; for(int cur_person = 0; cur_person <n; cur_person++){ deque<int> base; for(int i = 0; i<16; i++){ base.push_back(OP(0, 0, OP_ZERO, top, operations, operands)); } for(int other_person = 0; other_person<n; other_person++){ deque<int> cur_addend; for(int j = 0; j<16; j++){ cur_addend.push_back(OP(la+cur_person * n + other_person, addend[other_person][j], OP_AND, top, operations, operands)); } deque<int> res; add(base, cur_addend, res, top, operations, operands); swap(res, base); } bases[cur_person] = base; } //cout<<"converting back"<<endl; for(int id= 0; id<n; id++){ deque<int> id_base; for(int i = 0; i<16; i++){ id_base.push_back(OP(0, 0, OP_ZERO, top, operations, operands)); } for(int rank = 0; rank<n; rank++){ for(int j = 0; j<16; j++) id_base[j] = OP(id_base[j], OP(bases[rank][j], n*16 + rank*30 + id,OP_AND, top, operations, operands), OP_XOR, top, operations, operands); } for(int j = 0; j<16; j++) outputs_circuit[id][j] =id_base[j]; } return top; }

Compilation message (stderr)

abc.cpp: In function 'int bob(int, const char (*)[5], const char (*)[5], bool*)':
abc.cpp:87:10: warning: variable 'cmp' set but not used [-Wunused-but-set-variable]
   87 |     auto cmp = [&](pair<string, int>& lh, pair<string, int>& rh){
      |          ^~~
#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...