제출 #549315

#제출 시각아이디문제언어결과실행 시간메모리
549315jesus_coconutVision Program (IOI19_vision)C++17
100 / 100
18 ms1608 KiB
#include <bits/stdc++.h>
#include "vision.h"
#define pb push_back
#define eb emplace_back

using namespace std;

int h, w, k;

void consLine(int H, int W, int K) {
	vector<int> v;
	for (int i = 0; i + K < max(H, W); ++i) {
		v.pb(add_and({i, i + K}));
	}
	add_or(v);
}

vector<int> getRows() {
	vector<int> ret(h);
	vector<int> tmp(w);
	for (int i = 0; i < h; ++i) {
		for (int j = 0; j < w; ++j) {
			tmp[j] = w * i + j;
		}
		ret[i] = add_xor(tmp);
	}
	return ret;
}

vector<int> getCols() {
	vector<int> ret(w), tmp(h);
	for (int j = 0; j < w; ++j) {
		for (int i = 0; i < h; ++i) {
			tmp[i] = w * i + j;
		}
		ret[j] = add_xor(tmp);
	}
	return ret;
}

void solvek1() {
	auto rows = getRows();
	auto cols = getCols();
	vector<int> adjRows, adjCols;
	for (int i = 0; i + 1 < size(rows); ++i) adjRows.eb(add_and({rows[i], rows[i+1]}));
	for (int i = 0; i + 1 < size(cols); ++i) adjCols.eb(add_and({cols[i], cols[i+1]}));
	int x = add_or(adjRows);
	int y = add_or(adjCols);
	int a = add_xor({x, y});
	int z1 = add_xor(rows);
	int z2 = add_xor(cols);
	int b = add_xor({z1, z2});
	add_and({a, b});
}

vector<int> pref_xor(vector<int> const &v) {
	vector<int> ret;
	ret.pb(v.front());
	for (int i = 1; i < size(v); ++i) {
		ret.pb(add_xor({v[i], ret[i - 1]}));
	}
	return ret;
}

int zero;

vector<int> calcSum(vector<int> &a, vector<int> &b) {
	vector<int> ret;
	int carry = zero;
	a.resize(max(size(a), size(b)), zero);
	b.resize(max(size(a), size(b)), zero);
	for (int i = 0; i < size(a); ++i) {
		ret.pb(add_xor({a[i], b[i], carry}));
		int tmp = add_or({a[i], b[i], carry});
		int tmp2 = add_and({a[i], b[i], carry});
		int nb = add_not(ret.back());
		int tmp3 = add_or({tmp2, nb});
		carry = add_and({tmp, tmp3});
	}
	ret.pb(carry);
	return ret;
}

vector<int> getSum(vector<int> const &v, int l, int r) {
	if (r - l == 1) return {v[l]};
	if (r - l <= 0) return {zero};
	int m = (r + l) / 2;
	auto x = getSum(v, l, m);
	auto y = getSum(v, m, r);
	return calcSum(x, y);
}


void construct_network(int H, int W, int K) {
	h = H;
	w = W;
	k = K;
	if (min(H, W) == 1) {
		consLine(H, W, K);
		return;
	}
	int tmp = add_not(0);
	zero = add_and({0, tmp});
	auto v = pref_xor(getRows());
	for (auto a : pref_xor(getCols())) v.pb(a);
	auto s = getSum(v, 0, size(v));
	for (int i = 0; i < size(s); ++i) {
		if (((k >> i) & 1) == 0) {
			s[i] = add_not(s[i]);
		}
	}
	add_and(s);
}

컴파일 시 표준 에러 (stderr) 메시지

vision.cpp: In function 'void solvek1()':
vision.cpp:45:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |  for (int i = 0; i + 1 < size(rows); ++i) adjRows.eb(add_and({rows[i], rows[i+1]}));
      |                  ~~~~~~^~~~~~~~~~~~
vision.cpp:46:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |  for (int i = 0; i + 1 < size(cols); ++i) adjCols.eb(add_and({cols[i], cols[i+1]}));
      |                  ~~~~~~^~~~~~~~~~~~
vision.cpp: In function 'std::vector<int> pref_xor(const std::vector<int>&)':
vision.cpp:59:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |  for (int i = 1; i < size(v); ++i) {
      |                  ~~^~~~~~~~~
vision.cpp: In function 'std::vector<int> calcSum(std::vector<int>&, std::vector<int>&)':
vision.cpp:72:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |  for (int i = 0; i < size(a); ++i) {
      |                  ~~^~~~~~~~~
vision.cpp: In function 'void construct_network(int, int, int)':
vision.cpp:107:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |  for (int i = 0; i < size(s); ++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...