Submission #591056

#TimeUsernameProblemLanguageResultExecution timeMemory
591056Soumya1Vision Program (IOI19_vision)C++17
44 / 100
83 ms5376 KiB
#include "vision.h"
#include <bits/stdc++.h>
#ifdef __LOCAL__
	#include <debug_local.h>
#endif
using namespace std;
void construct_network(int H, int W, int K) {
	vector<int> posleft(H + W), posxorleft(H + W);
	for (int diag = 0; diag <= H + W - 2; diag++) {
		vector<int> v;
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				if (i + j == diag) {
					v.push_back(i * W + j);
				}
			}
		}
		posleft[diag] = add_or(v);
		posxorleft[diag] = add_xor(v);
	}
	vector<int> posright(H + W), posxorright(H + W);
	for (int diag = 0; diag <= H + W - 2; diag++) {
		vector<int> v;
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				if (j - i + H - 1 == diag) {
					v.push_back(i * W + j);
				}
			}
		}
		posright[diag] = add_or(v);
		posxorright[diag] = add_xor(v);
	}
	vector<int> hastwoleft(H + W);
	for (int diag = 0; diag <= H + W - 2; diag++) {
		vector<int> v1, v2;
		for (int d = diag; d <= min(H + W - 2, diag + 2 * K); d++) {
			v1.push_back(posleft[d]);
			v2.push_back(posxorleft[d]);
		}
		int orr = add_or(v1);
		int xorr = add_xor(v2);
		hastwoleft[diag] = add_and({orr, add_not(xorr)});
	}
	vector<int> hastworight(H + W);
	for (int diag = 0; diag <= H + W - 2; diag++) {
		vector<int> v1, v2;
		for (int d = diag; d <= min(H + W - 2, diag + 2 * K); d++) {
			v1.push_back(posright[d]);
			v2.push_back(posxorright[d]);
		}
		int orr = add_or(v1);
		int xorr = add_xor(v2);
		hastworight[diag] = add_and({orr, add_not(xorr)});
	}
	vector<int> twodiagleft(H + W);
	for (int diag = 0; diag <= H + W - 2 - K; diag++) {
		twodiagleft[diag] = add_and({posleft[diag], posleft[diag + K]});
	}
	vector<int> twodiagright(H + W);
	for (int diag = 0; diag <= H + W - 2 - K; diag++) {
		twodiagright[diag] = add_and({posright[diag], posright[diag + K]});
	}
	int first;
	{
		vector<int> v;
		for (int diag = 0; diag <= H + W - 2 - K; diag++) {
			v.push_back(twodiagleft[diag]);
		}
		int f1 = add_or(v);
		v.clear();
		for (int diag = 0; diag <= H + W - 2; diag++) {
			v.push_back(hastworight[diag]);
		}
		int f2 = add_or(v);
		first = add_and({f1, f2});
	}
	int second;
	{
		vector<int> v;
		for (int diag = 0; diag <= H + W - 2 - K; diag++) {
			v.push_back(twodiagright[diag]);
		}
		int f1 = add_or(v);
		v.clear();
		for (int diag = 0; diag <= H + W - 2; diag++) {
			v.push_back(hastwoleft[diag]);
		}
		int f2 = add_or(v);
		second = add_and({f1, f2});
	}
	add_or({first, second});
}
#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...