Submission #1366442

#TimeUsernameProblemLanguageResultExecution timeMemory
1366442EJIC_B_KEDAXVision Program (IOI19_vision)C++20
24 / 100
12 ms2876 KiB
#include "vision.h"
#include <bits/stdc++.h>
#include <cassert>

using namespace std;

void construct_network(int h, int w, int k) {
    int fre = h * w;
    const int K = 13;
    if (k <= K) {
        vector<vector<int>> sq((h + K - 1) / K, vector<int>((w + K - 1) / K));
        for (int i = 0; i < sq.size(); i++) {
            for (int j = 0; j < sq[i].size(); j++) {
                vector<int> in;
                for (int x = 0; x < K && i * K + x < h; x++) {
                    for (int y = 0; y < K && j * K + y < w; y++) {
                        in.push_back((i * K + x) * w + j * K + y);
                    }
                }
                sq[i][j] = fre;
                add_or(in);
                add_xor(in);
                fre += 2;
            }
        }
        // cout << fre << '\n';
        vector<int> sqs;
        for (int i = 0; i < sq.size(); i++) {
            for (int j = 0; j < sq[i].size(); j++) {
                if (i + 1 < sq.size() && j + 1 < sq[i].size()) {
                    add_or({sq[i][j], sq[i + 1][j], sq[i][j + 1], sq[i + 1][j + 1]});
                    add_xor({sq[i][j] + 1, sq[i + 1][j] + 1, sq[i][j + 1] + 1, sq[i + 1][j + 1] + 1});
                } else if (i + 1 < sq.size()) {
                    add_or({sq[i][j], sq[i + 1][j]});
                    add_xor({sq[i][j] + 1, sq[i + 1][j] + 1});
                } else if (j + 1 < sq[i].size()) {
                    add_or({sq[i][j], sq[i][j + 1]});
                    add_xor({sq[i][j] + 1, sq[i][j + 1] + 1});
                } else {
                    // cout << i << ' ' << j << '\n';
                    add_or({sq[i][j]});
                    add_xor({sq[i][j] + 1});
                }
                add_not(fre + 1);
                add_and({fre, fre + 2});
                sqs.push_back(fre + 3);
                fre += 4;
            }
        }

        const int B = 50;


        vector<int> sc;
        for (int i = 0; i < B; i++) {
            for (int j = 0; j < B; j++) {
                vector<int> in1, in2;
                for (int x = i; x < h; x += B) {
                    for (int y = j; y < w; y += B) {
                        in1.push_back(x * w + y);
                        for (int d = 0; d < k; d++) {
                            int x1 = x + d;
                            int y1 = y + k - d;
                            if (x1 >= 0 && x1 < h && y1 >= 0 && y1 < w) {
                                in2.push_back(x1 * w + y1);
                            }
                        }
                        for (int d = 0; d < k; d++) {
                            int x1 = x + k - d;
                            int y1 = y - d;
                            if (x1 >= 0 && x1 < h && y1 >= 0 && y1 < w) {
                                in2.push_back(x1 * w + y1);
                            }
                        }
                    }
                }
                if (!in1.empty() && !in2.empty()) {
                    // cout << i << ' ' << j << "\n-----------\n";
                    // for (auto v : in1) {
                    //     cout << v / w << ' ' << v % w << '\n';
                    // }
                    // cout << "==========\n";
                    // for (auto v : in2) {
                    //     cout << v / w << ' ' << v % w << '\n';
                    // }
                    // cout << "==========\n";
                    add_or(in1);
                    add_or(in2);
                    add_and({fre, fre + 1});
                    sc.push_back(fre + 2);
                    fre += 3;
                }
            }
        }
        int fans = fre;
        assert(!sqs.empty());
        add_or(sqs);
        fre++;
        int sans = fre;
        assert(!sc.empty());
        add_or(sc);
        fre++;
        add_and({fans, sans});
        fre++;
    }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...