Submission #581620

#TimeUsernameProblemLanguageResultExecution timeMemory
581620georgievskiyVision Program (IOI19_vision)C++14
100 / 100
89 ms9316 KiB
#include "vision.h"
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>

int has2(vector<int> a, int or_ = -1) {
    if (or_ == -1) or_ = add_or(a);
    int xor_ = add_xor(a);
    int nxor_ = add_not(xor_);
    int ans = add_and(vector<int>({nxor_, or_}));
    return ans;
}

vector<vector<int>> dr, dl;
vector<int> dl_or, dr_or;
int dl_has2_all, dr_has2_all;

void precalc(int n, int m, int k) {
    dl.resize(n + m - 1), dr.resize(n + m - 1);
    int pi = 0;
    for (int i = n - 1; i >= 0; i--, pi++) {
        for (int x = i, y = 0; x < n && y < m; x++, y++)
            dr[pi].push_back(x * m + y);
    }
    for (int j = 1; j < m; j++, pi++) {
        for (int x = 0, y = j; x < n && y < m; x++, y++)
            dr[pi].push_back(x * m + y);
    }
    pi=0;
    for (int i = n - 1; i >= 0; i--, pi++) {
        for (int x = i, y = m - 1; x < n && y >= 0; x++, y--)
            dl[pi].push_back(x * m + y);
    }
    for (int j = m - 2; j >= 0; j--, pi++) {
        for (int x = 0, y = j; x < n && y >= 0; x++, y--)
            dl[pi].push_back(x * m + y);
    }
    vector<int> dl_has2, dr_has2;

    for (auto diag : dl)
        dl_or.push_back(add_or(diag));
    for (auto diag : dr)
        dr_or.push_back(add_or(diag));

    for (int i = 0; i < n + m - 1; i++)
        dl_has2.push_back(has2(dl[i], dl_or[i]));
    for (int i = 0; i < n + m - 1; i++)
        dr_has2.push_back(has2(dr[i], dr_or[i]));

    dl_has2_all = add_or(dl_has2), dr_has2_all = add_or(dr_has2);
}

int construct_less(int n, int m, int k) {
    vector<int> dl_k, dr_k;
    for (int i = 0; i + 1 < n + m - 1; i++) {
        vector<int> t;
        for (int j = i; j < i + k && j < n + m - 1; j++) {
            t.push_back(dl_or[j]);
        }
        dl_k.push_back(has2(t));
        //cout << "dl_k[]" << i << '=' << dl_k[i] << '\n';
    }
    for (int i = 0; i + 1 < n + m - 1; i++) {
        vector<int> t;
        for (int j = i; j < i + k && j < n + m - 1; j++) {
            t.push_back(dr_or[j]);
        }
        dr_k.push_back(has2(t));
        //cout << "dr_k[]" << i << '=' << dr_k[i] << '\n';
    }
    dl_k.push_back(dl_has2_all), dr_k.push_back(dr_has2_all);

    int dl_k_all = add_or(dl_k), dr_k_all = add_or(dr_k);

    int ans = add_and(vector<int>({dl_k_all, dr_k_all}));

    return ans;
}

void construct_network(int n, int m, int k) {
    precalc(n, m, k);
    int x = construct_less(n, m, k);
    int y = construct_less(n, m, k + 1);
    int nx = add_not(x);
    int ans = add_and(vector<int>({nx, y}));
}

Compilation message (stderr)

vision.cpp: In function 'void construct_network(int, int, int)':
vision.cpp:85:9: warning: unused variable 'ans' [-Wunused-variable]
   85 |     int ans = add_and(vector<int>({nx, y}));
      |         ^~~
#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...