답안 #749392

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
749392 2023-05-27T23:16:33 Z BalintR 앨리스, 밥, 서킷 (APIO23_abc) C++17
54 / 100
87 ms 7656 KB
#include <bits/stdc++.h>
#include "abc.h"
using namespace std;

typedef unsigned short ushort;
typedef unsigned uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<pii> vpii;
typedef complex<double> cpx;
template <typename T> using minPq = priority_queue<T, vector<T>, greater<T>>;
#define ms(a, x) memset(a, x, sizeof(a))
#define pb push_back
#define fs first
#define sn second
#define ALL(v) begin(v), end(v)
#define SZ(v) ((int) (v).size())
#define lbv(v, x) (lower_bound(ALL(v), x) - (v).begin())
#define ubv(v, x) (upper_bound(ALL(v), x) - (v).begin())
template <typename T> inline void UNIQUE(vector<T> &v){sort(ALL(v)); v.resize(unique(ALL(v)) - v.begin());}
const int INF = 0x3f3f3f3f;
const ll LLINF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1);
#define FR(i, n) for(int i = 0; i < (n); i++)
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define FORR(i, a, b) for(int i = (a); i >= (b); i--)
#define dbg(x) {cerr << #x << ' ' << x << endl;}
#define dbgArr(arr, n) {cerr << #arr; FR(_i, n) cerr << ' ' << (arr)[_i]; cerr << endl;}

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

const int K = 16;

void writeNum(bool *out, int &sz, int x){
    FR(j, K) out[sz++] = (x >> j) & 1;
}

int alice(const int n, const char names[][5],  const ushort arr[], bool out[]){
    vector<string> sorted;
    FR(i, n) sorted.pb(string(names[i]));
    sort(ALL(sorted));
    //dbgArr(sorted, SZ(sorted));

    vi permArr(n);

    FR(i, n){
        int p = lbv(sorted, (string(names[i])));
        out[i*n + p] = 1;
        permArr[p] = arr[i];
    }

    int sz = n*n;
    FR(i, n) writeNum(out, sz, permArr[i]);
    return sz;
}

int bob(const int m, const char lrr[][5], const char rrr[][5], bool out[]){
    vector<string> sorted;
    FR(i, m) sorted.pb(string(lrr[i]));
    FR(i, m) sorted.pb(string(rrr[i]));
    UNIQUE(sorted);

    int n = SZ(sorted);
    FR(i, m){
        int a = lbv(sorted, (string(lrr[i])));
        int b = lbv(sorted, (string(rrr[i])));
        out[n*a + b] = 1;
    }

    return n*n;
}

typedef array<int, K> Num;

int sz;
int *ops, (*opIn)[2];

int doOp(int a, int b, int op){
    ops[sz] = op;
    opIn[sz][0] = a;
    opIn[sz][1] = b;
    return sz++;
}

Num add(Num n1, Num n2){
    Num res{};
    int carry[K];

    res[0] = doOp(n1[0], n2[0], OP_XOR);
    carry[0] = doOp(n1[0], n2[0], OP_AND);

    FOR(i, 1, K){
        int a = n1[i];
        int b = n2[i];
        int c = carry[i-1];

        int x = doOp(a, b, OP_XOR);
        res[i] = doOp(x, c, OP_XOR);
        int c1 = doOp(a, b, OP_AND);
        int c2 = doOp(x, c, OP_AND);
        carry[i] = doOp(c1, c2, OP_OR);
    }

    return res;
}

Num andNum(Num a, int x){
    Num res{};
    FR(i, K) res[i] = doOp(a[i], x, OP_AND);
    return res;
}

Num orNum(Num a, Num b){
    Num res{};
    FR(i, K) res[i] = doOp(a[i], b[i], OP_OR);
    return res;
}

int circuit(const int la, const int lb, int OPS[], int OP_IN[][2], int RES[][16]){
    ops = OPS, opIn = OP_IN;
    int n = sqrt(lb);
    sz = la+lb;

    vector<Num> arr(n), vrr(n);
    FR(i, n) FR(j, K) arr[i][j] = n*n + i*K + j;
    FR(i, n) FR(j, K) vrr[i][j] = doOp(0, 0, 0);

    FR(i, n) FR(j, n) vrr[j] = add(vrr[j], andNum(arr[i], la + i*n + j));

    vector<Num> res(n);
    FR(i, n) FR(j, K) res[i][j] = doOp(0, 0, 0);

    FR(i, n) FR(j, n) res[i] = orNum(res[i], andNum(vrr[j], i*n + j));

    FR(i, n) FR(j, K) RES[i][j] = res[i][j];

    //dbgArr(ops, sz);

    return sz;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 1248 KB WA Your functions alice(), bob(), circuit() finished successfully, but the final output binary string is incorrect.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 1248 KB WA Your functions alice(), bob(), circuit() finished successfully, but the final output binary string is incorrect.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 1248 KB WA Your functions alice(), bob(), circuit() finished successfully, but the final output binary string is incorrect.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 3716 KB Correct!
2 Correct 41 ms 5556 KB Correct!
3 Correct 52 ms 6176 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 3716 KB Correct!
2 Correct 41 ms 5556 KB Correct!
3 Correct 52 ms 6176 KB Correct!
4 Correct 55 ms 5708 KB Correct!
5 Correct 68 ms 6156 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 3716 KB Correct!
2 Correct 41 ms 5556 KB Correct!
3 Correct 52 ms 6176 KB Correct!
4 Correct 55 ms 5708 KB Correct!
5 Correct 68 ms 6156 KB Correct!
6 Correct 47 ms 5692 KB Correct!
7 Correct 87 ms 7656 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 852 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 852 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 1248 KB WA Your functions alice(), bob(), circuit() finished successfully, but the final output binary string is incorrect.
2 Halted 0 ms 0 KB -