Submission #1244224

#TimeUsernameProblemLanguageResultExecution timeMemory
1244224AmaarsaaVision Program (IOI19_vision)C++20
100 / 100
45 ms7128 KiB
#include<bits/stdc++.h>
#include "vision.h"


using namespace std;
using ll = int;


int ind;

int not_greater_left (int H, int W, int S){
	S ++;
	ll i, lo, hi, lo_ind1, r, lo_ind2, j;
	vector < int > v[502];
	vector < int > answer;
	ind = H * W;
	lo = 1e9;
	hi= 0;
	for (i = 0; i < H; i ++) {
		for ( j = 0; j < W; j ++) {
			r = j - i + H;
			lo = min(lo, r);
			hi = max(hi, r);
			v[r].push_back(i * W + j);
		}
	}
	lo_ind1 = -1;
	for (i = lo; i <= hi; i ++) {
		if ( lo_ind1 == -1) {
			lo_ind1 = add_or(v[i]);
		}
		else add_or(v[i]);
	}
	lo_ind2 = -1;
	for (i = lo; i <= hi; i ++) {
		if ( lo_ind2 == -1) {
			lo_ind2 = add_xor(v[i]);
		}
		else add_xor(v[i]);
	}

	for (i = lo; i + (S) - 1 <= hi; i ++) {
		vector < int > q;
		for ( j = i; j <= i + (S) - 1; j ++) {
			q.push_back(lo_ind2 + (j - lo));
		}
		ind = add_xor(q);
		q.clear();
		add_not(ind);
		for ( j = i; j <= i + (S) - 1; j ++) {
			q.push_back(lo_ind1 + (j - lo));
		}
		ind = add_or(q);
		q.clear();
		q.push_back(ind - 1);
		q.push_back(ind);
		ind = add_and(q);
		answer.push_back(ind);
		ind ++;
	}
	return add_or(answer);
}

int not_greater_right (int H, int W, int S){
	S ++;
	ll i, lo, hi, lo_ind1, r, lo_ind2, j;
	vector < int > v[502];
	vector < int > answer;
	ind = H * W;
	lo = 1e9;
	hi= 0;
	for (i = 0; i < H; i ++) {
		for ( j = 0; j < W; j ++) {
			r = i + j ;
			lo = min(lo, r);
			hi = max(hi, r);
			v[r].push_back(i * W + j);
		}
	}
	lo_ind1 = -1;
	for (i = lo; i <= hi; i ++) {
		if ( lo_ind1 == -1) {
			
			lo_ind1 = add_or(v[i]);
		}
		else {
			add_or(v[i]);
		}
	}
	lo_ind2 = -1;
	for (i = lo; i <= hi; i ++) {
		if ( lo_ind2 == -1) {
			lo_ind2 = add_xor(v[i]);
		}
		else {
			add_xor(v[i]) ;
		}
	}

	for (i = lo; i + (S) - 1 <= hi; i ++) {
		vector < int > q;
		for ( j = i; j <= i + (S) - 1; j ++) {
			q.push_back(lo_ind2 + (j - lo));
		}
		ind = add_xor(q);
		q.clear();
		add_not(ind);
		q.clear();
		for ( j = i; j <= i + (S) - 1; j ++) {
			q.push_back(lo_ind1 + (j - lo));
		}
		ind = add_or(q);
		q.clear();
		q.push_back(ind - 1);
		q.push_back(ind);
		ind = add_and(q);
		answer.push_back(ind);
	}
	return add_or(answer);
}

void construct_network(int H, int W, int K) {
// left
	int a, b, c, d;
	vector < int > q;
	a = not_greater_left(H, W, K - 1);
	b = not_greater_left(H, W, K);
	c = not_greater_right(H, W, K - 1);
	d = not_greater_right(H, W, K);
	a = add_not(a);
	c = add_not(c);
	
	q.push_back(a);
	q.push_back(b);
	add_and(q);
	q.clear();
	q.push_back(c);
	q.push_back(d);
	ind = add_and(q);
	q.clear();
	q.push_back(ind);
	q.push_back(ind - 1);
	ind = add_or(q);
	q.clear();
	q.push_back(b);
	q.push_back(d);
	q.push_back(ind);
	add_and(q);
}
#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...