Submission #1042513

#TimeUsernameProblemLanguageResultExecution timeMemory
1042513SharkyVision Program (IOI19_vision)C++17
100 / 100
34 ms3800 KiB
#include <bits/stdc++.h>
#include "vision.h"
using namespace std;

map<int, int> l1, l2, r1, r2;
int lk, lleqk, rk, rleqk, lz, rz;

void construct_network(int H, int W, int K) {
	vector<int> lzv, rzv;
	for (int tar = 0; tar <= H + W - 2; tar++) {
		vector<int> arg;
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				if (i + j == tar) arg.push_back(i * W + j);
			}
		}
		l1[tar] = add_or(arg);
		int tmp = add_xor(arg);
		tmp = add_not(tmp);
		l2[tar] = add_and(vector<int> {l1[tar], tmp});
		lzv.push_back(l2[tar]);
	}
	for (int tar = -W + 1; tar <= H - 1; tar++) {
		vector<int> arg;
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				if (i - j == tar) arg.push_back(i * W + j);
			}
		}
		r1[tar] = add_or(arg);
		int tmp = add_xor(arg);
		tmp = add_not(tmp);
		r2[tar] = add_and(vector<int> {r1[tar], tmp});
		rzv.push_back(r2[tar]);
	}
	lz = add_or(lzv);
	rz = add_or(rzv);
	vector<int> arg;
	for (int lb = 0; lb <= H + W - 2; lb++) {
		int rb = lb + K;
		if (rb <= H + W - 2) arg.push_back(add_and(vector<int> {l1[lb], l1[rb]}));
	}
	lk = add_or(arg);
	arg.clear();
	vector<int> arg2;
	for (int lb = 0; lb <= H + W - 3; lb++) {
		int rb = lb + K;
		for (int i = lb + 1; i <= min(H + W - 2, rb); i++) arg.push_back(l1[i]);
		int tmp = add_or(arg);
		arg.clear();
		arg2.push_back(add_and(vector<int> {l1[lb], tmp}));
	}
	arg2.push_back(lz);
	lleqk = add_or(arg2);
	arg2.clear();
	for (int lb = -W + 1; lb <= H - 1; lb++) {
		int rb = lb + K;
		if (rb <= H - 1) arg.push_back(add_and(vector<int> {r1[lb], r1[rb]}));
	}
	rk = add_or(arg);
	arg.clear();
	for (int lb = -W + 1; lb <= H - 2; lb++) {
		int rb = lb + K;
		for (int i = lb + 1; i <= min(H - 1, rb); i++) arg.push_back(r1[i]);
		int tmp = add_or(arg);
		arg.clear();
		arg2.push_back(add_and(vector<int> {r1[lb], tmp}));
	}
	arg2.push_back(rz);
	rleqk = add_or(arg2);
	int A = add_and(vector<int> {lk, rleqk});
	int B = add_and(vector<int> {rk, lleqk});
	add_or(vector<int> {A, B});
}
#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...