답안 #834658

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
834658 2023-08-22T16:39:24 Z tranxuanbach Vision Program (IOI19_vision) C++17
12 / 100
8 ms 1364 KB
#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);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Incorrect 0 ms 212 KB on inputs (0, 1), (1, 0), expected 1, but computed 0
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Incorrect 0 ms 212 KB on inputs (0, 1), (1, 0), expected 1, but computed 0
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Incorrect 0 ms 212 KB on inputs (0, 1), (1, 0), expected 1, but computed 0
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Incorrect 0 ms 212 KB on inputs (0, 1), (1, 0), expected 1, but computed 0
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 5 ms 852 KB Output is correct
3 Correct 5 ms 852 KB Output is correct
4 Correct 7 ms 980 KB Output is correct
5 Correct 1 ms 464 KB Output is correct
6 Correct 4 ms 724 KB Output is correct
7 Correct 6 ms 980 KB Output is correct
8 Correct 7 ms 1104 KB Output is correct
9 Correct 2 ms 340 KB Output is correct
10 Correct 4 ms 596 KB Output is correct
11 Correct 6 ms 852 KB Output is correct
12 Correct 5 ms 852 KB Output is correct
13 Correct 7 ms 980 KB Output is correct
14 Correct 7 ms 980 KB Output is correct
15 Correct 1 ms 340 KB Output is correct
16 Correct 4 ms 724 KB Output is correct
17 Correct 7 ms 880 KB Output is correct
18 Correct 5 ms 852 KB Output is correct
19 Correct 6 ms 980 KB Output is correct
20 Correct 7 ms 1056 KB Output is correct
21 Correct 0 ms 212 KB Output is correct
22 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 0 ms 212 KB on inputs (0, 0), (1, 1), expected 1, but computed 0
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 1364 KB on inputs (96, 130), (143, 84), expected 0, but computed 1
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Incorrect 0 ms 212 KB on inputs (0, 1), (1, 0), expected 1, but computed 0
7 Halted 0 ms 0 KB -