답안 #957660

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
957660 2024-04-04T07:18:14 Z nguyentunglam 앨리스, 밥, 서킷 (APIO23_abc) C++17
66 / 100
81 ms 9800 KB
#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;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1296 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1296 KB Correct!
2 Correct 2 ms 1264 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1296 KB Correct!
2 Correct 2 ms 1264 KB Correct!
3 Correct 53 ms 7044 KB Correct!
4 Correct 52 ms 6880 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 6012 KB Correct!
2 Correct 38 ms 6476 KB Correct!
3 Correct 44 ms 7208 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 6012 KB Correct!
2 Correct 38 ms 6476 KB Correct!
3 Correct 44 ms 7208 KB Correct!
4 Correct 47 ms 8020 KB Correct!
5 Correct 56 ms 7132 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 6012 KB Correct!
2 Correct 38 ms 6476 KB Correct!
3 Correct 44 ms 7208 KB Correct!
4 Correct 47 ms 8020 KB Correct!
5 Correct 56 ms 7132 KB Correct!
6 Correct 41 ms 6988 KB Correct!
7 Correct 81 ms 9800 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2 ms 1112 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2 ms 1112 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1296 KB Correct!
2 Correct 2 ms 1264 KB Correct!
3 Correct 53 ms 7044 KB Correct!
4 Correct 52 ms 6880 KB Correct!
5 Correct 9 ms 6012 KB Correct!
6 Correct 38 ms 6476 KB Correct!
7 Correct 44 ms 7208 KB Correct!
8 Correct 47 ms 8020 KB Correct!
9 Correct 56 ms 7132 KB Correct!
10 Correct 41 ms 6988 KB Correct!
11 Correct 81 ms 9800 KB Correct!
12 Runtime error 2 ms 1112 KB Execution killed with signal 11
13 Halted 0 ms 0 KB -