Submission #775994

#TimeUsernameProblemLanguageResultExecution timeMemory
775994_martynasVision Program (IOI19_vision)C++14
100 / 100
63 ms7432 KiB
#include "vision.h"
#include <bits/stdc++.h>

using namespace std;

void visualize(int H, int W, vector<int> A) {
    vector<vector<char>> B(H, vector<char>(W, '.'));
    for(int x : A) B[x/W][x%W] = '#';
    for(int i = 0; i < H; i++) {
        for(int j = 0; j < W; j++) {
            cerr << B[i][j];
        }
        cerr << "\n";
    }
}

void construct_network(int H, int W, int K) {
    /* sample interaction
	std::vector<int> Ns;
	Ns = {0, 1};
	int a = add_and(Ns);
	Ns = {0, a};
	int b = add_or(Ns);
	Ns = {0, 1, b};
	int c = add_xor(Ns);
	add_not(c);
	*/
    vector<vector<int>> diag1, diag2;
    diag1 = diag2 = vector<vector<int>>(H+W-1);
    /*  diag1 (down right)  diag2 (down left)
        ---------           ---------
        |c|d|e|f|           |f|e|d|c|
        ---------           ---------
        |b|c|d|e|           |e|d|c|b|
        ---------           ---------
        |a|b|c|d|           |d|c|b|a|
        ---------           ---------
    */
    // diag1
    for(int i = 0; i < H; i++) {
        for(int x = H-i-1, y = 0; x < H && y < W; x++, y++) {
            diag1[i].push_back(x*W+y);
        }
    }
    for(int i = H; i < H+W-1; i++) {
        for(int x = 0, y = i-H+1; x < H && y < W; x++, y++) {
            diag1[i].push_back(x*W+y);
        }
    }
//    for(int i = 0; i < H+W-1; i++) {
//        cerr << i << ":\n";
//        visualize(H, W, diag1[i]);
//    }
    // diag2
    for(int i = 0; i < H; i++) {
        for(int x = H-i-1, y = W-1; x < H && y >= 0; x++, y--) {
            diag2[i].push_back(x*W+y);
        }
    }
    for(int i = H; i < H+W-1; i++) {
        for(int x = 0, y = W-(i-H)-2; x < H && y >= 0; x++, y--) {
            diag2[i].push_back(x*W+y);
        }
    }
//    for(int i = 0; i < H+W-1; i++) {
//        cerr << i << ":\n";
//        visualize(H, W, diag2[i]);
//    }
    /// Returns an index to the answer
    auto dist_less_than_K = [&]() {
        vector<int> diag1_or(H+W-1), diag2_or(H+W-1); // indices not values
        vector<int> diag1_xor(H+W-1), diag2_xor(H+W-1); // indices not values
        for(int i = 0; i < H+W-1; i++) {
            vector<int> query;
            for(int x : diag1[i]) query.push_back(x);
            diag1_or[i] = add_or(query);
            diag1_xor[i] = add_xor(query);
            query.clear();
            for(int x : diag2[i]) query.push_back(x);
            diag2_or[i] = add_or(query);
            diag2_xor[i] = add_xor(query);
        }
        vector<int> diag1_range_ok, diag2_range_ok; // indices not values
        for(int i = 0; i+K-1 < H+W-1; i++) {
            vector<int> query;
            for(int j = i; j < i+K; j++) query.push_back(diag1_or[j]);
            int range_or = add_or(query);
            query.clear();
            for(int j = i; j < i+K; j++) query.push_back(diag1_xor[j]);
            int range_xor = add_xor(query);
            diag1_range_ok.push_back(add_and(vector<int>{range_or, add_not(range_xor)}));
        }
        for(int i = 0; i+K-1 < H+W-1; i++) {
            vector<int> query;
            for(int j = i; j < i+K; j++) query.push_back(diag2_or[j]);
            int range_or = add_or(query);
            query.clear();
            for(int j = i; j < i+K; j++) query.push_back(diag2_xor[j]);
            int range_xor = add_xor(query);
            diag2_range_ok.push_back(add_and(vector<int>{range_or, add_not(range_xor)}));
        }
        int ok = add_and(vector<int>{add_or(diag1_range_ok), add_or(diag2_range_ok)});
        return ok;
    };
    int ok1 = dist_less_than_K();
    K++;
    int ok2 = dist_less_than_K();
    add_and(vector<int>{add_not(ok1), ok2});
}
#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...