Submission #485833

#TimeUsernameProblemLanguageResultExecution timeMemory
485833ljubaVision Program (IOI19_vision)C++17
14 / 100
24 ms2740 KiB
#include "vision.h"
#include <bits/stdc++.h>

using namespace std;

map<int, vector<int>> leva, desna;
map<int, int> ksorLeva, ksorDesna;
map<int, int> orLeva, orDesna;

int izracunajLevo(int K) {
    vector<int> pitaj;

    for(auto z : leva) {
        int ksor = ksorLeva[z.first];
        int ili = orLeva[z.first];
        ksor = add_not(ksor);
        pitaj.push_back(add_and({ksor, ili}));
    }

    for(auto z : leva) {
        int prvi = z.first;
        int drugi = z.first+K;
        if(!leva.count(drugi))
            continue;
        prvi = orLeva[prvi], drugi = orLeva[drugi];
        pitaj.push_back(add_and({prvi, drugi}));
    }

    return add_or(pitaj);
}

int izracunajDesno(int K) {
    vector<int> pitaj;

    for(auto z : desna) {
        int ksor = ksorDesna[z.first];
        int ili = orDesna[z.first];
        ksor = add_not(ksor);
        pitaj.push_back(add_and({ksor, ili}));
    }

    for(auto z : desna) {
        int prvi = z.first;
        int drugi = z.first+K;
        if(!desna.count(drugi))
            continue;
        prvi = orDesna[prvi], drugi = orDesna[drugi];
        pitaj.push_back(add_and({prvi, drugi}));
    }

    return add_or(pitaj);

}

int calc(int K) {
    int prvi = izracunajLevo(K);
    int drugi = izracunajDesno(K);
    return add_and({prvi, drugi});
}

void construct_network(int H, int W, int K) {
    for(int i = 0; i < H; ++i) {
        for(int j = 0; j < W; ++j) {
            int trenutni = i*W + j;
            desna[i-j].push_back(trenutni);
            leva[i+j].push_back(trenutni);
        }
    }

    for(auto z : leva) {
        ksorLeva[z.first] = add_xor(z.second);
        orLeva[z.first] = add_or(z.second);
    }

    for(auto z : desna) {
        ksorDesna[z.first] = add_xor(z.second);
        orDesna[z.first] = add_or(z.second);
    }

    if(K == 1) {
        calc(1);
        return;
    }

    int prvi = K-1, drugi = K;
    prvi = calc(prvi), drugi = calc(drugi);
    add_xor({prvi, drugi});
}
#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...