Submission #1366505

#TimeUsernameProblemLanguageResultExecution timeMemory
1366505EJIC_B_KEDAXVision Program (IOI19_vision)C++20
24 / 100
10 ms2880 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;
            }
        }
        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 {
                    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()) {
                    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++;
        return;
    }
    const int B = 1;



    vector<int> sc;
    for (int i = 0; i < h; i += 2) {
        for (int j = 0; j < w; j++) {
            vector<int> in1, in2;
            for (int x = i; x < min(i + 2, h); x++) {
                for (int y = j; y < w; y += 200) {
                    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()) {
                // add_or(in1);
                add_or(in2);
                add_and({in1[0], fre});
                sc.push_back(fre + 1);
                fre += 2;
            }
        }
    }
    vector<int> white, black;
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            if ((i + j) & 1) {
                black.push_back(i * w + j);
            } else {
                white.push_back(i + w + j);
            }
        }
    }
    if (k & 1) {
        add_or(white);
        add_or(black);
        add_and({fre, fre + 1});
        fre += 3;
    } else {
        cout << "HUI\n";
        add_or(white);
        add_xor(white);
        add_not(fre + 1);
        add_and({fre, fre + 2});
        fre += 4;
        add_or(black);
        add_xor(black);
        add_not(fre + 1);
        add_and({fre, fre + 2});
        fre += 4;
        add_or({fre - 1, fre - 5});
        fre++;
    }
    assert(!sc.empty());
    add_or(sc);
    add_and({fre, fre - 1});
    fre += 2;
}
#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...