제출 #1071243

#제출 시각아이디문제언어결과실행 시간메모리
1071243Gromp15Vision Program (IOI19_vision)C++17
52 / 100
29 ms2732 KiB
#include "vision.h"
#include <bits/stdc++.h>
#define ll long long
#define ar array
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
using namespace std;
template<typename T> bool ckmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }
template<typename T> bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }

void construct_network(int H, int W, int K) {
	if (K == 1) {
		int idx = -1;
		for (int i = 0; i < H; i++) {
			vector<int> cur;
			for (int j = 0; j < W; j++) {
				cur.push_back(i*W+j);
			}
			if (idx == -1) idx = add_or(cur);
			else idx = add_xor({idx, add_or(cur)});
		}
		for (int i = 0; i < W; i++) {
			vector<int> cur;
			for (int j = 0; j < H; j++) {
				cur.push_back(j*W+i);
			}
			assert(~idx);
			idx = add_xor({idx, add_or(cur)});
		}
		int idx2 = -1;
		for (int i = 0; i < H-1; i++) {
			vector<int> cur;
			for (int j = 0; j < W; j++) {
				cur.push_back(i*W+j);
				cur.push_back((i+1)*W+j);
			}
			if (idx2 == -1) idx2 = add_or(cur);
			else idx2 = add_or({idx2, add_or(cur)});
		}
		for (int i = 0; i < W-1; i++) {
			vector<int> cur;
			for (int j = 0; j < H; j++) {
				cur.push_back(j*W+i);
				cur.push_back(j*W+i+1);
			}
			if (idx2 == -1) idx2 = add_or(cur);
			else idx2 = add_or({idx2, add_or(cur)});
		}
		assert(~idx);
		assert(~idx2);
		add_and({idx, idx2});
	}
	vector<int> res;
	if ((H <= 30 && W <= 30) || min(H, W) == 1) {
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				vector<int> cur;
				for (int k = 0; k < H; k++) {
					for (int l = 0; l < W; l++) {
						if (abs(k - i) + abs(j - l) == K) {
							cur.emplace_back(k*W+l);
						}
					}
				}
				if (cur.size()) {
					int idx = add_or(cur);
					res.emplace_back(add_and({i*W+j, idx}));
				}
			}
		}
	}
	else {
		vector<int> cur;
		for (int k = 0; k < H; k++) {
			for (int l = 0; l < W; l++) {
				if (k + l == K) {
					cur.emplace_back(k*W+l);
				}
			}
		}
		if (cur.size()) {
			int idx = add_or(cur);
			res.emplace_back(add_and({0, idx}));
		}
	}
	add_or(res);
}
#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...