This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "vision.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 2e2 + 5, M = 1e4 + 5;
int n, m, k;
int cnt_dia;
vector <int> query;
int offset_tmp;
int offset_original;
int zero, one;
int offset_maindia; // y - x
int offset_antidia; // y + x
int offset_k_maindia;
int offset_k_antidia;
int offset_kn1_maindia;
int offset_kn1_antidia;
int same_maindia;
int same_antidia;
int within_k;
int within_kn1;
void construct_network(int _n, int _m, int _k){
n = _n; m = _m; k = _k;
cnt_dia = n + m - 1;
offset_original = 0;
query = {offset_original + (0 * m + 0), add_not(offset_original + (0 * m + 0))};
zero = add_and(query);
one = add_or(query);
offset_maindia = one + 1 - (0 - (n - 1));
for (int dia = 0 - (n - 1); dia <= (m - 1) - 0; dia++){
query.clear();
for (int y = 0; y < m; y++){
int x = y - dia;
if (not (0 <= x and x < n)){
continue;
}
query.emplace_back(offset_original + (x * m + y));
}
add_xor(query);
}
offset_antidia = offset_maindia + ((m - 1) - 0) + 1 - (0 + 0);
for (int dia = 0 + 0; dia <= (n - 1) + (m - 1); dia++){
query.clear();
for (int y = 0; y < m; y++){
int x = dia - y;
if (not (0 <= x and x < n)){
continue;
}
query.emplace_back(offset_original + (x * m + y));
}
add_xor(query);
}
offset_tmp = offset_antidia + ((n - 1) + (m - 1)) + 1 - (0 - (n - 1));
for (int dia = 0 - (n - 1); dia <= (m - 1) - 0; dia++){
query = {zero};
for (int dia2 = dia + 1; dia2 <= min(dia + k, (m - 1) - 0); dia2++){
query.emplace_back(offset_maindia + dia2);
}
add_or(query);
}
offset_k_maindia = offset_tmp + ((m - 1) - 0) + 1 - (0 - (n - 1));
for (int dia = 0 - (n - 1); dia <= (m - 1) - 0; dia++){
query = {offset_maindia + dia, offset_tmp + dia};
add_and(query);
}
offset_tmp = offset_k_maindia + ((m - 1) - 0) + 1 - (0 + 0);
for (int dia = 0 + 0; dia <= (n - 1) + (m - 1); dia++){
query = {zero};
for (int dia2 = dia + 1; dia2 <= min(dia + k, (n - 1) + (m - 1)); dia2++){
query.emplace_back(offset_antidia + dia2);
}
add_or(query);
}
offset_k_antidia = offset_tmp + ((n - 1) + (m - 1)) + 1 - (0 + 0);
for (int dia = 0 + 0; dia <= (n - 1) + (m - 1); dia++){
query = {offset_antidia + dia, offset_tmp + dia};
add_and(query);
}
offset_tmp = offset_k_antidia + ((n - 1) + (m - 1)) + 1 - (0 - (n - 1));
for (int dia = 0 - (n - 1); dia <= (m - 1) - 0; dia++){
query = {zero};
for (int dia2 = dia + 1; dia2 <= min(dia + (k - 1), (m - 1) - 0); dia2++){
query.emplace_back(offset_maindia + dia2);
}
add_or(query);
}
offset_kn1_maindia = offset_tmp + ((m - 1) - 0) + 1 - (0 - (n - 1));
for (int dia = 0 - (n - 1); dia <= (m - 1) - 0; dia++){
query = {offset_maindia + dia, offset_tmp + dia};
add_and(query);
}
offset_tmp = offset_kn1_maindia + ((m - 1) - 0) + 1 - (0 + 0);
for (int dia = 0 + 0; dia <= (n - 1) + (m - 1); dia++){
query = {zero};
for (int dia2 = dia + 1; dia2 <= min(dia + (k - 1), (n - 1) + (m - 1)); dia2++){
query.emplace_back(offset_antidia + dia2);
}
add_or(query);
}
offset_kn1_antidia = offset_tmp + ((n - 1) + (m - 1)) + 1 - (0 + 0);
for (int dia = 0 + 0; dia <= (n - 1) + (m - 1); dia++){
query = {offset_antidia + dia, offset_tmp + dia};
add_and(query);
}
offset_tmp = offset_kn1_maindia + ((n - 1) + (m - 1)) + 1 - (0);
query = {};
for (int dia = 0 - (n - 1); dia <= (m - 1) - 0; dia++){
query.emplace_back(offset_maindia + dia);
}
add_or(query);
same_maindia = add_not(offset_tmp + 0);
offset_tmp = same_maindia + 1 - (0);
query = {};
for (int dia = 0; dia <= (n - 1) + (m - 1); dia++){
query.emplace_back(offset_antidia + dia);
}
add_or(query);
same_antidia = add_not(offset_tmp + 0);
offset_tmp = same_antidia + 1 - (0);
query = {same_maindia};
for (int dia = 0 - (n - 1); dia <= (m - 1) - 0; dia++){
query.emplace_back(offset_k_maindia + dia);
}
add_or(query);
query = {same_antidia};
for (int dia = 0; dia <= (n - 1) + (m - 1); dia++){
query.emplace_back(offset_k_antidia + dia);
}
add_or(query);
query = {offset_tmp + 0, offset_tmp + 1};
within_k = add_and(query);
offset_tmp = within_k + 1 - (0);
query = {same_maindia};
for (int dia = 0 - (n - 1); dia <= (m - 1) - 0; dia++){
query.emplace_back(offset_kn1_maindia + dia);
}
add_or(query);
query = {same_antidia};
for (int dia = 0; dia <= (n - 1) + (m - 1); dia++){
query.emplace_back(offset_kn1_antidia + dia);
}
add_or(query);
query = {offset_tmp + 0, offset_tmp + 1};
within_kn1 = add_and(query);
query = {within_k, add_not(within_kn1)};
add_and(query);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |