Submission #1247138

#TimeUsernameProblemLanguageResultExecution timeMemory
1247138eradaxVision Program (IOI19_vision)C++20
100 / 100
28 ms4548 KiB
#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;
int rline, lline;
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, int delt2, pi p, auto func, vi& v) {
        vi line;

        dbg(p.first);
        dbg(p.second);

        for (; bet(0, p.first, H) && bet(0, p.second, W); p.first += delt, p.second += delt2)
            line.push_back(p.first * W + p.second);

        dbg(line);

        func(line);
        v.push_back(inst++); 
    };

    for (int i = H - 1; i >= 0; i--)
        gen_line(1, 1, {i, 0}, add_or, digr_or);
    for (int i = 1; i < W; i++)
        gen_line(1, 1, {0, i}, add_or, digr_or);

    add_xor(digr_or);
    rline = inst++;

    for (int i = 0; i < W; i++)
        gen_line(1, -1, {0, i}, add_or, digl_or);
    for (int i = 1; i < H; i++)
        gen_line(1, -1, {i, W-1}, add_or, digl_or);

    add_xor(digl_or);
    lline = inst++;

    auto consec = [](int k, vi& digor, int Q) {
        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); // P
            inst++;
            add_xor(intv); // P'
            inst++;
            add_not(inst - 1); // not P'
            inst++;
            add_or({inst - 1, Q});
            inst++;

            add_and({inst - 4, inst - 1}); // P & not P'
            ret.push_back(inst++);
        }

        return ret;
    };

    vi k_consec_r = consec(K, digr_or, rline);
    vi k_consec_l = consec(K, digl_or, lline);
    vi kp_consec_r = consec(K+1, digr_or, rline);
    vi kp_consec_l = consec(K+1, digl_or, lline);

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