Submission #1243290

#TimeUsernameProblemLanguageResultExecution timeMemory
1243290banganVision Program (IOI19_vision)C++20
58 / 100
29 ms2456 KiB
#include "vision.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

#define MT make_tuple

void brute_force(int h, int w, int k) {
	int n = h*w;
	set<tuple<int, int, int, int>> S;
	for (int r1=0; r1<h; r1++) for (int c1=0; c1<w; c1++) {
		for (int r2=0;r2<h; r2++) for (int c2=0; c2<w; c2++) {
			if (abs(r1-r2) + abs(c1-c2) == k) {
				tuple T1 = MT(r1, c1, r2, c2);
				tuple T2 = MT(r2, c2, r1, c1);
				if (S.contains(T1) || S.contains(T2)) continue;
				S.insert(T1);
				S.insert(T2);

				int x = r1*w + c1;
				int y = r2*w + c2;
				add_and({x, y}); n++;
			}
		}
	}
	vector<int> vec;
	for (int i=h*w; i<n; i++) vec.pb(i);
	add_or(vec);
}

void k_one(int h, int w, int k) {
	if (min(h, w) == 1) {
		brute_force(h, w, k);
		return;
	}

	auto f = [&](int r, int c) -> int {
		return r*w + c;
	};

	int n = h*w;
	for (int r=0; r<h; r++) {
		vector<int> vec;
		for (int c=0; c<w; c++) vec.pb(f(r, c));
		add_xor(vec); n++;
	}
	for (int c=0; c<w; c++) {
		vector<int> vec;
		for (int r=0; r<h; r++) vec.pb(f(r, c));
		add_xor(vec); n++;
	}

	vector<int> A, B;
	for (int i = h*w; i+1 < h*w+h; i++) {
		A.pb(add_and({i, i+1}));
		n++;
	}
	for (int i = h*w+h; i+1 < h*w+h+w; i++) {
		B.pb(add_and({i, i+1}));
		n++;
	}

	add_or(A); n++;
	add_or(B); n++;

	A.clear();
	B.clear();
	for (int i = h*w; i < h*w+h; i++) A.pb(i);
	for (int i = h*w+h; i < h*w+h+w; i++) B.pb(i);

	add_or(A); n++;
	add_or(B); n++;

	add_not({n-1});
	add_not({n-2});
	n += 2;

	add_and({n-1, n-5});
	add_and({n-2, n-6});
	n += 2;

	add_xor({n-1, n-2});
}

void construct_network(int h, int w, int k) {
	if (k==1) {
		k_one(h, w, k);
		return;
	}

	auto f = [&](int r, int c) -> int {
		return r*w + c;
	};

	vector<int> imp;
	for (int r=0; r<h; r++) for (int c=0; c<w; c++) {
		vector<int> vec;
		for (int i=r; i<h; i++) for (int j=0; j<w; j++) if (abs(i-r) + abs(j-c) == k) vec.pb(f(i, j));
		if (vec.empty()) continue;

		int t = add_or(vec);
		imp.pb(add_and({t, f(r, c)}));
	}
	add_or(imp);
}
#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...