Submission #417223

#TimeUsernameProblemLanguageResultExecution timeMemory
417223priority_queueVision Program (IOI19_vision)C++14
100 / 100
29 ms2828 KiB
#include <bits/stdc++.h>
 
#define forint(i, N) for (int i = 0; i < (N); i++)
 
using namespace std;
 
//vector<int> v = {1, 0, 0, 0, 1, 0};
//vector<int> v = {0, 1, 0, 1, 0, 0};
vector<int> v = {0, 0, 1, 1, 0, 0};

int add_not(int N);
int add_and(vector<int> N);
int add_or(vector<int> N);
int add_xor(vector<int> N);
 
void construct_network(int h, int w, int k) {
	
	vector<int> right;
 
	int vsize = h * w - 1;
 
	for (int i = h - 1; i >= 1; i--) {
		int a = i;
		int b = 0;
 
		vector<int> tmp;
 
		while (b < w && a < h) {				

			tmp.push_back(a * w + b);
 
			a++;
			b++;
		}
	
 
		vsize++;
		right.push_back(vsize);
		add_or(tmp);
	}
	
	for (int i = 0; i < w; i++) {
		int a = 0;
		int b = i;
 
		vector<int> tmp;
 
		while (b < w && a < h) {

			tmp.push_back(a * w + b);
 
			a++;
			b++;
		}
 
		vsize++;
		right.push_back(vsize);
		add_or(tmp);
	}
 
	//cerr << vsize << " right diagonal" << endl;
 
	//cerr << "ja" << endl;
 
	vector<int> left;
 
	for (int i = 0; i < h - 1; i++) {
		int a = i;
		int b = 0;
 
		vector<int> tmp;
 
		while (b < w && a >= 0) {

			tmp.push_back(a * w + b);
 
			a--;
			b++;
		}

 
		vsize++;
		left.push_back(vsize);
		add_or(tmp);
	}
 
 

	for (int i = 0; i < w; i++) {
		int a = h - 1;
		int b = i;
 
		vector<int> tmp;
 
		while (b < w && a >= 0) {

			tmp.push_back(a * w + b);
 
			a--;
			b++;
		}

		vsize++;
		left.push_back(vsize);
		add_or(tmp);
	}

	vector<int> right_test;
	vector<int> left_test;
 
	forint(i, right.size() - k) {
		vsize++;
		right_test.push_back(vsize);
		add_and({right[i], right[i + k]});
		vsize++;
		left_test.push_back(vsize);
		add_and({left[i], left[i + k]});
	}


	//cerr << "ja" << endl;
	vector<int> right2;
	vector<int> left2; 
 
	forint(i, right.size() - k) {
		vector<int> tmp1;
		vector<int> tmp2;
 
		for (int j = i; j <= i + k; j++) {
			tmp1.push_back(right[j]);
			tmp2.push_back(left[j]);
		}
		//cerr << "ja " <<endl;
		vsize += 2;
		add_or(tmp1);
 
		add_xor(tmp1);
 
		add_xor({vsize - 1, vsize});
 
		vsize++;
 
		right2.push_back(vsize);
 
		vsize += 2;
 
		add_or(tmp2);
 
		add_xor(tmp2);
 
		add_xor({vsize - 1, vsize});
 
		vsize++;
 
		
		left2.push_back(vsize);
	}
 
	vsize++;
 
	add_xor(right);
	int a = vsize;
 
	vsize++;
	add_xor(left);
 
	int b = vsize;
 
	//cerr << "ja" << endl;
	vsize++;
	add_or(right2);
//cerr << v[vsize] << " ok " << endl;	   
	vsize++;
	add_or(left2);
 //cerr << v[vsize] << " ok " << endl;	  

	vsize++;
	vsize++;

	add_or({a, vsize - 3});
 
	//cerr << v[a] << ":" << v[vsize-2] << " ok " << endl;	  
 
	add_or({b, vsize - 2});
 
	vsize++;
	add_or(right_test);
 
 	//cerr << v[vsize] << endl;

	vsize++;
	add_or(left_test);

//cerr << v[vsize] << " ok " << endl;	

	/*
	for(auto a : left_test) {
		cerr << v[a] << " ...\n";
	}
	cerr << v[vsize] << " OR " << v[v.size()-1] << endl;
    */

	vsize++;

	//cerr << "== " << vsize - 4 << "&" << vsize - 1 << endl;

	add_and({vsize - 4, vsize - 1});
	add_and({vsize - 3, vsize - 2});
	vsize++;
 
	//cerr << v[vsize-1] << " OR " << v[vsize] << endl;
	add_or({vsize - 1, vsize});	
}

Compilation message (stderr)

vision.cpp: In function 'void construct_network(int, int, int)':
vision.cpp:3:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    3 | #define forint(i, N) for (int i = 0; i < (N); i++)
      |                                        ^
vision.cpp:111:2: note: in expansion of macro 'forint'
  111 |  forint(i, right.size() - k) {
      |  ^~~~~~
vision.cpp:3:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    3 | #define forint(i, N) for (int i = 0; i < (N); i++)
      |                                        ^
vision.cpp:125:2: note: in expansion of macro 'forint'
  125 |  forint(i, right.size() - k) {
      |  ^~~~~~
#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...