Submission #201624

#TimeUsernameProblemLanguageResultExecution timeMemory
201624khulegubVision Program (IOI19_vision)C++14
0 / 100
28 ms2544 KiB
#include "vision.h"
#include <bits/stdc++.h>

#define pb push_back
#define mp make_pair
#define rr first
#define cc second

using namespace std;

typedef pair<int, int> pii;

int hh, ww, kk;

pii to_pair(int x){
	return mp(x / ww, x % ww);
}
int to_linear(pii x){
	return x.rr * ww + x.cc; 
}

void construct_network(int H, int W, int K) {

	// proj y
	hh = H, ww = W, kk = K;

	int one = add_or( {0, add_not(0)} ), zero = add_not(one);

	vector<int> proj_hor, hor;
	vector<int> proj_ver, ver;

	int bitlen = 9;

	vector<int> counter;

	for (int i = 0; i < ww; i++){
		vector<int> send;
		for (int j = 0; j < hh; j++){
			send.pb(to_linear(mp(i, j)));
		}
		proj_hor.pb(add_or(send));
	}
	for (int i = 0; i < ww; i++){
		vector<int> send_pre, send_suf;
		for (int j = 0; j <= i; j++){
			send_pre.pb(proj_hor[j]);
		}
		for (int j = i; j < ww; j++){
			send_suf.pb(proj_hor[j]);
		}
		hor.pb( add_and({add_or(send_pre), add_or(send_suf)}) );
	}
	for (int i = 0; i < hh; i++){
		vector<int> send;
		for (int j = 0; j < ww; j++){
			send.pb(to_linear(mp(j, i)));
		}
		proj_ver.pb(add_or(send));
	}

	for (int i = 0; i < hh; i++){
		vector<int> send_pre, send_suf;
		for (int j = 0; j <= i; j++){
			send_pre.pb(proj_ver[j]);
		}
		for (int j = i; j < hh; j++){
			send_suf.pb(proj_ver[j]);
		}
		ver.pb( add_and({add_or(send_pre), add_or(send_suf)}) );
	}

	// initialize
	for (int i = 0; i < bitlen; i++){
		counter.pb(zero);
	}

	for (int j = 0; j < ww; j++){
		int adder = hor[j];
		for (int i = 0; i < bitlen; i++){
			int tmp = counter[i];
			counter[i] = add_xor({counter[i], adder});
			adder = add_and({tmp, adder});
		}
	}
	for (int j = 0; j < hh; j++){
		int adder = ver[j];
		for (int i = 0; i < bitlen; i++){
			int tmp = counter[i];
			counter[i] = add_xor({counter[i], adder});
			adder = add_and({tmp, adder});
		}
	}

	kk = kk + 2;
	int last = one;
	vector<int> kkbits;

	for (int i = 0; i < bitlen; i++){
		kkbits.pb(kk % 2);
		kk /= 2;
	}

	for (int i = 0; i < bitlen; i++){
		if (kkbits[i]){
			last = add_and({last, counter[i]});
		}
		else{
			last = add_and({last, add_not(counter[i]) });
		}
	}
}
#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...