Submission #376338

#TimeUsernameProblemLanguageResultExecution timeMemory
376338InternetPerson10Vision Program (IOI19_vision)C++14
100 / 100
89 ms8168 KiB
#include <bits/stdc++.h>
#include "vision.h"

using namespace std;

vector<int> N1, N2, N1_2, N1_3, N1_4, N1_5, N1_6, N2_2, N2_3, N2_4, N2_5, N2_6, nums, ph, ph2;

void construct_network(int H, int W, int K) {
	nums = {0, add_not(0)};
	int BLANK = add_and(nums);
	for(int i = 0; i < H+W-1; i++) {
		vector<int>().swap(nums);
		for(int j = max(0, i+1-W); j < min(H, i+1); j++) {
			nums.push_back(j*W + i-j);
			// cout << i << ' ' << j << '\n';
		}
		N1.push_back(add_xor(nums));
	}
	for(int i = 0; i < H+W-1; i++) {
		vector<int>().swap(nums);
		for(int j = max(0, i+1-W); j < min(H, i+1); j++) {
			nums.push_back((H-j-1)*W + i-j);
		}
		N2.push_back(add_xor(nums));
	}
	int X = N1.size(); // X = H + W - 1; X > K
	for(int i = 0; i < X+K; i++) {
		vector<int>().swap(nums);
		for(int j = max(0, i-K); j <= min(i, X-1); j++) {
			nums.push_back(N1[j]);
		}
		N1_2.push_back(add_xor(nums));
	}
	for(int i = 0; i < X+K; i++) {
		vector<int>().swap(nums);
		for(int j = max(0, i-K); j <= min(i, X-1); j++) {
			nums.push_back(N2[j]);
		}
		N2_2.push_back(add_xor(nums));
	}
	X = N1_2.size(); // X = H + W + K - 1; X > 2K
	for(int i = 0; i < X-2; i++) {
		vector<int>().swap(nums);
		nums.push_back(N1_2[i]);
		nums.push_back(add_not(N1_2[i+1]));
		nums.push_back(N1_2[i+2]);
		N1_3.push_back(add_and(nums));
	}
	for(int i = 0; i < X-2; i++) {
		vector<int>().swap(nums);
		nums.push_back(N2_2[i]);
		nums.push_back(add_not(N2_2[i+1]));
		nums.push_back(N2_2[i+2]);
		N2_3.push_back(add_and(nums));
	}
	K++;
	for(int i = 0; i <= X-2*K; i++) {
		vector<int>().swap(nums);
		nums.resize(2*K);
		for(int j = 0; j < 2*K; j++) nums[j] = N1_2[i+j];
		N1_4.push_back(add_and(nums));
	}
	for(int i = 0; i <= X-2*K; i++) {
		vector<int>().swap(nums);
		nums.resize(2*K);
		for(int j = 0; j < 2*K; j++) nums[j] = N2_2[i+j];
		N2_4.push_back(add_and(nums));
	}
	for(int i = 0; i <= X-K; i++) {
		vector<int>().swap(nums);
		nums.resize(K);
		for(int j = 0; j < K; j++) nums[j] = N1_2[i+j];
		N1_5.push_back(add_and(nums));
	}
	for(int i = 0; i <= X-K; i++) {
		vector<int>().swap(nums);
		nums.resize(K);
		for(int j = 0; j < K; j++) nums[j] = N2_2[i+j];
		N2_5.push_back(add_and(nums));
	}
	int good1 = add_or(N1_3), good2 = add_or(N2_3);
	if(N1_4.size()) N1_6.push_back(add_or(N1_4));
	else N1_6.push_back(BLANK);
	ph.push_back(add_or(N1_2));
	ph.push_back(add_or(N1_5));
	ph.push_back(add_not(add_xor(N1_5)));
	N1_6.push_back(add_and(ph));
	vector<int>().swap(ph);
	if(N2_4.size()) N2_6.push_back(add_or(N2_4));
	else N2_6.push_back(BLANK);
	ph.push_back(add_or(N2_2));
	ph.push_back(add_or(N2_5));
	ph.push_back(add_not(add_xor(N2_5)));
	N2_6.push_back(add_and(ph));
	vector<int>().swap(ph);
	int bad1 = add_or(N1_6), bad2 = add_or(N2_6);
	ph = {good1, good2};
	ph2 = {bad1, bad2};
	vector<int>().swap(nums);
	nums.push_back(add_or(ph));
	nums.push_back(add_not(add_or(ph2)));
	add_and(nums);
}
#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...