Submission #1075871

#TimeUsernameProblemLanguageResultExecution timeMemory
1075871j_vdd16Vision Program (IOI19_vision)C++17
100 / 100
29 ms3028 KiB
#include "vision.h"

#include <algorithm>
#include <bitset>
#include <cstdint>
#include <cstring>
#include <iostream>
#include <limits.h>
#include <math.h>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

//#define int long long
#define loop(X, N) for(int X = 0; X < (N); X++)
#define all(V) V.begin(), V.end()
#define rall(V) V.rbegin(), V.rend()

using namespace std;

typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<vector<ii>> vvii;
typedef vector<bool> vb;
typedef vector<vector<bool>> vvb;

typedef uint64_t u64;
typedef int64_t i64;

vi rows, cols;
void construct_network(int H, int W, int K) {
    rows = vi(H);
    loop(i, H) {
        vi Ns;
        loop(j, W) {
            Ns.push_back(i * W + j);
        }

        rows[i] = add_or(Ns);
        //add_log(rows[i]);
    }
    cols = vi(W);
    loop(j, W) {
        vi Ns;
        loop(i, H) {
            Ns.push_back(i * W + j);
        }

        cols[j] = add_or(Ns);
        //add_log(cols[j]);
    }

    vi rowBits;
    loop(bit, 8) {
        vi ands;
        loop(i, H - (1 << bit)) {
            vi rs;
            for (int j = i + (1 << bit); j < H; j += 2 * (1 << bit)) {
                for (int j2 = j; j2 < min(H, j + (1 << bit)); j2++) {
                    rs.push_back(rows[j2]);
                }
            }
            if (rs.size() == 0) {
                break;
            }

            int l = rows[i];
            int r = add_or(rs);

            ands.push_back(add_and({l, r}));
        }

        if (ands.size() == 0) {
            break;
        }
        rowBits.push_back(add_or(ands));
        //add_log(rowBits.back());
    }

    vi colBits;
    loop(bit, 8) {
        vi ands;
        loop(i, W - (1 << bit)) {
            vi rs;
            for (int j = i + (1 << bit); j < W; j += 2 * (1 << bit)) {
                for (int j2 = j; j2 < min(W, j + (1 << bit)); j2++) {
                    rs.push_back(cols[j2]);
                }
            }
            if (rs.size() == 0) {
                break;
            }

            int l = cols[i];
            int r = add_or(rs);

            ands.push_back(add_and({l, r}));
        }

        if (ands.size() == 0) {
            break;
        }
        colBits.push_back(add_or(ands));
        //add_log(colBits.back());
    }

    const int zero = add_not(add_or(rows));
    if (colBits.size() > rowBits.size()) {
        swap(colBits, rowBits);
    }

    vi sum;
    int carry = zero;
    loop(bit, colBits.size()) {
        sum.push_back(add_xor({colBits[bit], rowBits[bit], carry}));
        carry = add_or({
            add_and({colBits[bit], rowBits[bit]}), 
            add_and({colBits[bit], carry}), 
            add_and({carry, rowBits[bit]})
        });
    }
    for (int bit = colBits.size(); bit < rowBits.size(); bit++) {
        sum.push_back(add_xor({rowBits[bit], carry}));
        carry = add_and({rowBits[bit], carry});
    }
    sum.push_back(carry);

    loop(bit, sum.size()) {
        if ((K & (1 << bit)) == 0) {
            sum[bit] = add_not(sum[bit]);
        }
    }

    if (K >= (1 << sum.size())) {
        add_not(add_not(zero));
        return;
    }

    add_and(sum);
}

Compilation message (stderr)

vision.cpp: In function 'void construct_network(int, int, int)':
vision.cpp:19:37: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 | #define loop(X, N) for(int X = 0; X < (N); X++)
      |                                     ^
vision.cpp:120:5: note: in expansion of macro 'loop'
  120 |     loop(bit, colBits.size()) {
      |     ^~~~
vision.cpp:128:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  128 |     for (int bit = colBits.size(); bit < rowBits.size(); bit++) {
      |                                    ~~~~^~~~~~~~~~~~~~~~
vision.cpp:19:37: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 | #define loop(X, N) for(int X = 0; X < (N); X++)
      |                                     ^
vision.cpp:134:5: note: in expansion of macro 'loop'
  134 |     loop(bit, sum.size()) {
      |     ^~~~
#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...