Submission #1370043

#TimeUsernameProblemLanguageResultExecution timeMemory
1370043viduxVision Program (IOI19_vision)C++17
100 / 100
5 ms1860 KiB
#include "vision.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

void construct_network(int n, int m, int K) {
	vector<int> Q, d1(n+m-1), d2(n+m-1), d1_2(n+m-1), d2_2(n+m-1);
	vector<vector<int>> all1(n+m-1), all2(n+m-1);
	for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) all1[i+j].push_back(i*m+j), all2[i+m-j-1].push_back(i*m+j);
	for (int i = 0; i < n+m-1; i++) {
		Q.clear();
		for (int id : all1[i]) Q.push_back(id);
		d1[i] = add_or(Q);
		d1_2[i] = add_not(add_xor(Q));
		Q = {d1[i], d1_2[i]};
		d1_2[i] = add_and(Q);
	}
	for (int i = 0; i < n+m-1; i++) {
		Q.clear();
		for (int id : all2[i]) Q.push_back(id);
		d2[i] = add_or(Q);
		d2_2[i] = add_not(add_xor(Q));
		Q = {d2[i], d2_2[i]};
		d2_2[i] = add_and(Q);
	}
	auto check = [&](int k, vector<int> d, vector<int> d2) -> int {
		vector<int> all;
		for (int i = 0; i+k < n+m-1; i++) {
			Q.clear();
			for (int j = i; j <= i+k; j++) Q.push_back(d[j]);
			int one = add_or(Q);
			int two = add_not(add_xor(Q));
			Q = {one, two};
			two = add_and(Q);
			all.push_back(two);
		}
		for (int i = 0; i < n+m-1; i++) all.push_back(d2[i]);
		return add_or(all);
	};
	add_and({
		add_and({check(K, d1, d1_2), check(K, d2, d2_2)}),
		add_not(add_and({check(K-1, d1, d1_2), check(K-1, d2, d2_2)}))
	});
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...