제출 #1314000

#제출 시각아이디문제언어결과실행 시간메모리
1314000b6e1앨리스, 밥, 서킷 (APIO23_abc)C++20
28 / 100
55 ms19388 KiB
/*
-A2 --indent=tab=4 --indent-classes --indent-switches --indent-namespaces --indent-preprocessor -xg -p -xd -H -xj -xe

read all problems
do first-eye problems
read rev order

uhhh dont fail impl
*/
#include <bits/stdc++.h>
#include "abc.h"
#define re(a, b, c, d) for (auto a = b; a <= c; a += d)
#define de(a, b, c, d) for (auto a = b; a >= c; a -= d)
#define ms(a, b) memset(a, b, sizeof (a))
#define wh(a) while (a --)
#define PII pair <int, int>
#define F first
#define S second
#define pb push_back
#define eb emplace_back
template <typename T> bool chkmin (T &a, T b) {
	return (b < a) ? a = b, 1 : 0;
}
template <typename T> bool chkmax (T &a, T b) {
	return (b > a) ? a = b, 1 : 0;
}
using namespace std;
const int N = 1e5 + 5;
// 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[]
) {
	outputs_alice[0] = 0;
	outputs_alice[1] = 1;
	int cur = 2, mod = (1 << 16);
	re (i, 0, n - 1, 1) {
		int tmp = numbers[i];
		re (lg, 0, 9, 1) {
			re (j, 0, 15, 1) outputs_alice[cur++] = tmp & (1 << j);
			tmp = (tmp * 2) % mod;
		}
	}
	for (int i = 0; i < 16; i++) outputs_alice[cur++] = 0;
	return cur;
}
// Bob
int // returns lb
bob (
    /*  in */ const int m,
    /*  in */ const char senders[][5],
    /*  in */ const char recipients[][5],
    /* out */ bool outputs_bob[]
) {
	vector<vector<int>> f (26, vector<int> (26, 0));
	for (int i = 0; i < m; i ++) f[senders[i][0] - 'a'][recipients[i][0] - 'a']++;
	int cnt = 0;
	for (int i = 0; i < 26; i++) for (int j = 0; j < 26; j++) for (int k = 0; k < 10; k++) outputs_bob[cnt++] = f[i][j] & (1 << k);
	return cnt;
}
// Circuit
int cnt, zero, one, n, m;
int upd (int a, int b, int operations[], int operands[][2]) {
	int rem = zero;
	vector<int> v;
	re (i, 0, 15, 1) {
		operations[cnt] = OP_XOR;
		operands[cnt][0] = a + i;
		operands[cnt][1] = b + i;
		int fxor = cnt++;
		operations[cnt] = OP_XOR;
		operands[cnt][0] = fxor;
		operands[cnt][1] = rem;
		v.push_back (cnt);
		int cxor = cnt++;
		operations[cnt] = OP_AND;
		operands[cnt][0] = a + i;
		operands[cnt][1] = b + i;
		int fand = cnt++;
		operations[cnt] = OP_AND;
		operands[cnt][0] = fxor;
		operands[cnt][1] = rem;
		int lst = cnt++;
		operations[cnt] = OP_OR;
		operands[cnt][0] = fand;
		operands[cnt][1] = lst;
		rem = cnt++;
	}
	int sv = cnt;
	re (i, 0, 15, 1) {
		operations[cnt] = OP_X0;
		operands[cnt][0] = v[i];
		operands[cnt][1] = v[i];
		cnt++;
	}
	return sv;
}
int qry (int a, int b, int operations[], int operands[][2]) {
	int sv = cnt;
	re (i, 0, 15, 1) {
		operations[cnt] = OP_AND;
		operands[cnt][0] = a + i;
		operands[cnt][1] = b;
		cnt++;
	}
	return sv;
}
int // returns l
circuit (
    /*  in */ const int la,
    /*  in */ const int lb,
    /* out */ int operations[],
    /* out */ int operands[][2],
    /* out */ int outputs_circuit[][16]
) {
	n = (la - 18) / 160;
	cnt = la + lb;
	zero = 0;
	one = 1;
	vector<int> cur (n), num (n);
	re (i, 0, n - 1, 1) cur[i] = 2 + n * 160, num[i] = 2 + i * 160;
	re (i, 0, n - 1, 1) {
		re (j, 0, n - 1, 1) {
			int x = la + (n * i + j) * 10;
			re (k, 0, 9, 1) {
				int t = qry (num[i] + 16 * k, x + k, operations, operands);
				cur[j] = upd (cur[j], t, operations, operands);
			}
		}
	}
	re (i, 0, n - 1, 1) re (j, 0, 15, 1) outputs_circuit[i][j] = cur[i] + 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...