제출 #834664

#제출 시각아이디문제언어결과실행 시간메모리
834664tranxuanbachVision Program (IOI19_vision)C++17
100 / 100
38 ms4468 KiB
#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_antidia + ((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 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...