Submission #719753

#TimeUsernameProblemLanguageResultExecution timeMemory
719753baojiaopisuVision Program (IOI19_vision)C++14
100 / 100
20 ms2864 KiB
#include "vision.h"
#include <vector>
#include <iostream>
using namespace std;
#define pb push_back
const int N = 500 + 10;
#define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "

int id[N][N], row[N], col[N], drow[N], dcol[N], not_dist_col[N], not_dist_row[N];
int dist_col[N], dist_row[N];

void construct_network(int n, int m, int k) {
	int iter = -1;
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < m; j++) {
			id[i][j] = ++iter;
		}
	}

	for(int i = 0; i < n; i++) {
		vector<int> q;
		for(int j = 0; j < m; j++) q.pb(id[i][j]);
		row[i] = ++iter;
		add_or(q);
	}

	int d = max(n, m);
	for(int i = 1; i <= d; i++) {
		int cnt = 0;
		int ii = 2, x = i;
		while(x > 1) {
			if(x % ii == 0) {
				++cnt;
				while(x % ii == 0) x /= ii;
			}
			++ii;
		}
		if(cnt > 1 || i >= n) continue;
		vector<int> t;
		vector<int> b;
		for(int j = 0; j < i; j++) {
			if(j + i >= n) {
				b.pb(row[j]);
				continue;
			}
			vector<int> q;
			for(int x = j; x < n; x += i) q.pb(row[x]);
			t.pb(++iter);
			add_xor(q);
		}

		if(b.size()) {
			++iter;
			add_or(b);
			t.pb(iter);
		}
		++iter;
		add_or(t);
		drow[i] = ++iter;
		add_not(iter - 1);
	}

	for(int i = n - 1; i >= 0; i--) {
		int x = i;
		vector<int> q;
		int ii = 2;
		if(i) q.pb(drow[1]);
		while(x > 1) {
			int curr = 1;
			if(x % ii == 0) {
				while(x % ii == 0) x /= ii, curr *= ii;
			}
			q.pb(drow[curr]);
			++ii;
		}

		for(int j = i + 1; j < n; j++) q.pb(not_dist_row[j]);
		if(n == 1) q.pb(row[0]);
		dist_row[i] = ++iter;
		add_and(q);
		not_dist_row[i] = ++iter;
		add_not(iter - 1);
	}

	for(int i = 0; i < m; i++) {
		vector<int> q;
		for(int j = 0; j < n; j++) q.pb(id[j][i]);
		col[i] = ++iter;
		add_or(q);
	}

	for(int i = 1; i <= d; i++) {
		int cnt = 0;
		int ii = 2, x = i;
		while(x > 1) {
			if(x % ii == 0) {
				++cnt;
				while(x % ii == 0) x /= ii;
			}
			++ii;
		}
		if(cnt > 1 || i >= m) continue;
		vector<int> t;
		vector<int> b;
		for(int j = 0; j < i; j++) {
			vector<int> q;
			if(j + i >= m) {
				b.pb(col[j]);
				continue;
			}
			for(int x = j; x < m; x += i) q.pb(col[x]);
			t.pb(++iter);
			add_xor(q);
		}

		if(b.size()) {
			++iter;
			add_or(b);
			t.pb(iter);
		}
		++iter;
		add_or(t);
		dcol[i] = ++iter;
		add_not(iter - 1);
	}

	for(int i = m - 1; i >= 0; i--) {
		int x = i;
		vector<int> q;
		int ii = 2;
		if(i) q.pb(dcol[1]);
		while(x > 1) {
			int curr = 1;
			if(x % ii == 0) {
				while(x % ii == 0) x /= ii, curr *= ii;
			}
			q.pb(dcol[curr]);
			++ii;
		}

		for(int j = i + 1; j < m; j++) q.pb(not_dist_col[j]);
		if(m == 1) q.pb(col[0]);
		dist_col[i] = ++iter;
		add_and(q);
		not_dist_col[i] = ++iter;
		add_not(iter - 1);
	}

	vector<int> q;
	for(int i = 0; i <= k; i++) {
		if(i > n - 1) break;
		if(k - i > m - 1) continue;
		++iter;
		add_and({dist_row[i], dist_col[k - i]});
		q.pb(iter);
	}

	add_or(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...