#include "vision.h"
#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
using vvi = vector<vi>;
using pi = pair<int, int>;
using vpi = vector<pi>;
using vvpi = vector<vpi>;
#define sz(c) ((int)c.size())
#define bet(l, x, h) ((l) <= (x) && (x) < (h))
#ifdef DBG
ofstream dbgs("dbg.txt");
#define dbg(expr) dbgs << "[" << __FUNCTION__ << ", " << __LINE__ << "] " << #expr << ": " << expr << endl
#else
#define dbg(...)
#endif
ostream& operator<<(ostream& o, const vi& v) {
o << "{";
for (auto i : v)
o << i << ", ";
o << "}";
return o;
}
vi digl_or, digr_or;
vi digl_xor, digr_xor;
int H, W, K;
int inst;
void construct_network(int _H, int _W, int _K) {
H = _H;
W = _W;
K = _K;
inst = H * W;
auto gen_line = [](int delt, pi p, auto func, vi& v) {
vi line;
for (; bet(0, p.first, H) && bet(0, p.second, W); p.first += delt, p.second += delt)
line.push_back(p.first * W + p.second);
dbg(line);
// dbg(func);
func(line);
v.push_back(inst++);
};
for (int i = H - 1; i >= 0; i--)
gen_line(1, {i, 0}, add_or, digr_or);
for (int i = 1; i < W; i++)
gen_line(1, {0, i}, add_or, digr_or);
for (int i = H - 1; i >= 0; i--)
gen_line(1, {i, 0}, add_xor, digr_xor);
for (int i = 1; i < W; i++)
gen_line(1, {0, i}, add_xor, digr_xor);
for (int i = 0; i < W; i++)
gen_line(-1, {0, i}, add_or, digl_or);
for (int i = 1; i < H; i++)
gen_line(-1, {i, W-1}, add_or, digl_or);
for (int i = 0; i < W; i++)
gen_line(-1, {0, i}, add_xor, digl_xor);
for (int i = 1; i < H; i++)
gen_line(-1, {i, W-1}, add_xor, digl_xor);
auto consec = [](int k, vi& digor, vi& digxor) {
vi ret;
dbg(H + W - k);
for (int i = 0; i < H + W - k; i++) {
vi intv;
for (int j = 0; j < k; j++)
intv.push_back(digor[i + j]);
dbg(intv);
add_or(intv);
inst++;
add_xor(intv);
inst++;
add_not(inst - 1);
inst++;
add_and({inst - 1, inst - 3});
inst++;
intv.clear();
for (int j = 0; j < K; j++)
intv.push_back(digxor[i + j]);
add_or(intv);
inst++;
add_not(inst - 1);
inst++;
add_and({inst - 1, inst - 6});
inst++;
add_or({inst - 1, inst - 4});
ret.push_back(inst++);
}
return ret;
};
if (K == H + W - 2) { // Same but perhaps edgecase
vi k_consec_r = consec(K, digr_or, digr_xor);
vi k_consec_l = consec(K, digl_or, digl_xor);
vi kp_consec_r = consec(K+1, digr_or, digr_xor);
vi kp_consec_l = consec(K+1, digl_or, digl_xor);
add_or(k_consec_l);
inst++;
add_or(k_consec_r);
inst++;
add_and({inst - 1, inst - 2});
inst++;
add_or(kp_consec_l);
inst++;
add_or(kp_consec_r);
inst++;
add_and({inst - 1, inst - 2});
inst++;
add_xor({inst - 1, inst - 4});
} else {
vi k_consec_r = consec(K, digr_or, digr_xor);
vi k_consec_l = consec(K, digl_or, digl_xor);
vi kp_consec_r = consec(K+1, digr_or, digr_xor);
vi kp_consec_l = consec(K+1, digl_or, digl_xor);
add_or(k_consec_l);
inst++;
add_or(k_consec_r);
inst++;
add_and({inst - 1, inst - 2});
inst++;
add_or(kp_consec_l);
inst++;
add_or(kp_consec_r);
inst++;
add_and({inst - 1, inst - 2});
inst++;
add_xor({inst - 1, inst - 4});
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |