Submission #151104

#TimeUsernameProblemLanguageResultExecution timeMemory
151104johuthaVision Program (IOI19_vision)C++14
100 / 100
24 ms2424 KiB
#include <vector>
#include "vision.h"
#include <iostream>

using namespace std;

struct picture
{
    int H, W;
    int dignr;

    int ldb;
    int rdb;

    int getnr(int y, int x)
    {
        return y*W + x;
    }

    int inside(int y, int x)
    {
        return (y >= 0) && (x >= 0) && (x < W) && (y < H);
    }

    vector<int> leftdig;

    vector<int> rightdig;

    void init_dig()
    {
        vector<int> leftdig_double;
        vector<int> rightdig_double;
        for (int i = 0; i < dignr; i++)
        {
            vector<int> fields;
            for (int j = 0; j < H; j++)
            {
                int x = i - j;
                int y = j;
                if (!inside(y, x)) continue;
                fields.push_back(getnr(y, x));
            }
            int n_in = add_or(fields);
            leftdig.push_back(n_in);
            int xr = add_xor(fields);
            leftdig_double.push_back(add_xor({n_in, xr}));
        }

        
        for (int i = W - dignr; i < W; i++)
        {
            vector<int> fields;
            for (int j = 0; j < H; j++)
            {
                int x = i + j;
                int y = j;
                if (!inside(y, x)) continue;
                fields.push_back(getnr(y, x));
            }
            int n_in = add_or(fields);
            rightdig.push_back(n_in);
            int xr = add_xor(fields);
            rightdig_double.push_back(add_xor({n_in, xr}));
        }

        ldb = add_or(leftdig_double);
        rdb = add_or(rightdig_double);
    }

    void init(int iH, int iW)
    {
        H = iH;
        W = iW;
        dignr = H + W - 1;
    }

    int smaller(int k)
    {
        k++;
        vector<int> allld;
        int curr = add_xor({0, 0});
        for (int i = 0; i < dignr; i++)
        {
            if (i - k >= 0)
            {
                curr = add_xor({curr, leftdig[i - k]});
            }
            allld.push_back(add_and({curr, leftdig[i]}));
            curr = add_xor({curr, leftdig[i]});
        }
        int inl = add_or({ldb, add_or(allld)});
        allld.clear();
        curr = add_xor({0, 0});
        for (int i = 0; i < dignr; i++)
        {
            if (i - k >= 0)
            {
                curr = add_xor({curr, rightdig[i - k]});
            }
            allld.push_back(add_and({curr, rightdig[i]}));
            curr = add_xor({curr, rightdig[i]});
        }
        int inr = add_or({rdb, add_or(allld)});
        return add_and({inl, inr});
    }
};

void construct_network(int H, int W, int K)
{
    picture pic;
    pic.init(H, W);
    pic.init_dig();
    add_xor({pic.smaller(K), pic.smaller(K - 1)});
}
#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...