Submission #573152

#TimeUsernameProblemLanguageResultExecution timeMemory
573152LawlietVision Program (IOI19_vision)C++17
100 / 100
40 ms4488 KiB
#include "vision.h"
#include <bits/stdc++.h>

using namespace std;

int h, w, k;

int idCell(int i, int j) { return i*w + j; }

int checkGreater(vector<int> ids, int t)
{
	vector<int> results;

	for(int i = 0 ; i + t < (int)ids.size() ; i++)
	{
		vector<int> query;

		for(int j = i + t ; j < (int)ids.size() ; j++)
			query.push_back( ids[j] );

		int suffixOr = add_or(query);
		results.push_back( add_and({ids[i], suffixOr}) );
	}

	return add_or(results);
}

void construct_network(int H, int W, int K) 
{
	h = H; w = W; k = K;

	if( k == h + w - 2 )
	{
		int a = add_and({idCell(0, 0), idCell(H - 1, W - 1)});
		int b = add_and({idCell(0, W - 1), idCell(H - 1, 0)});

		add_or({a, b});
		return;
	}

	vector<int> mainDiag, secDiag;

	for(int sum = 0 ; sum <= h + w - 2 ; sum++)
	{
		vector<int> query;

		for(int i = 0, j = sum ; i < h ; i++, j--)
			if( 0 <= j && j < w ) query.push_back( idCell(i, j) );

		mainDiag.push_back( add_or(query) );
	}	

	for(int diff = -w + 1 ; diff < h ; diff++)
	{
		vector<int> query;

		for(int i = 0, j = -diff ; i < h ; i++, j++)
			if( 0 <= j && j < w ) query.push_back( idCell(i, j) );

		secDiag.push_back( add_or(query) );
	}

	int secK = checkGreater(secDiag, k), secNxt = checkGreater(secDiag, k + 1);
	int mainK = checkGreater(mainDiag, k), mainNxt = checkGreater(mainDiag, k + 1);

	// secK or mainK must be one
	// secNxt and mainNxt must be zero

	int orK = add_or({secK, mainK});
	int orNxt = add_or({mainNxt, secNxt});

	add_xor({orK, orNxt});
}
#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...