# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
246992 | stoyan_malinin | Vision Program (IOI19_vision) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "vision.h"
//#include "grader.cpp"
#include<iostream>
#include<cstring>
#include<vector>
int n, m, k;
const int MAXLog = 15;
int zero, one;
struct Number
{
int b[20];
Number()
{
for(int bit = 0;bit<MAXLog;bit++)
{
this->b[bit] = zero;
}
}
Number(int x)
{
for(int bit = 0;bit<MAXLog;bit++)
{
this->b[bit] = (((x>>bit)&1)==0?zero:one);
}
}
int getVal()
{
int out = 0;
//for(int bit = 0;bit<MAXLog;bit++) out += memory_cells[ b[bit] ]*(1<<bit);
return out;
}
int &operator [](int ind)
{
return b[ind];
}
};
Number operator +(Number A, Number B)
{
Number C;
int toAdd = zero;
for(int i = 0;i<MAXLog;i++)
{
C[i] = add_xor({toAdd, A[i], B[i]});
toAdd = add_or({add_and({toAdd, A[i]}), add_and({toAdd, B[i]}), add_and({A[i], B[i]})});
}
return C;
}
Number operator -(Number A, Number B)
{
Number C;
int toRem = zero;
for(int i = 0;i<MAXLog;i++)
{
C[i] = add_xor({toRem, A[i], B[i]});
toRem = add_or({add_and({toRem, A[i], B[i]}), add_and({add_not(A[i]), add_or({toRem, B[i]})})});
}
return C;
}
int cell2Pos(int r, int c)
{
return n*r + c;
}
void init()
{
vector <int> all;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
all.push_back(cell2Pos(i, j));
}
}
zero = add_and(all);
one = add_or(all);
}
Number getDiff(vector <int> &v)
{
Number A, B;
int active = one;
for(int i = 0;i<v.size();i++)
{
int newVal = add_and({active, v[i]});
for(int bit = 0;bit<8;bit++)
{
if(((i>>bit)&1)==1)
{
A[bit] = add_or({A[bit], newVal});
}
}
active = add_and({active, add_not(v[i])});
}
active = one;
for(int i = v.size()-1;i>=0;i--)
{
int newVal = add_and({active, v[i]});
for(int bit = 0;bit<8;bit++)
{
if(((i>>bit)&1)==1)
{
B[bit] = add_or({B[bit], newVal});
}
}
active = add_and({active, add_not(v[i])});
}
Number diff = B - A;
return diff;
}
void construct_network(int H, int W, int K)
{
n = H;
m = W;
k = K;
init();
vector <int> v;
for(int i = 0;i<n;i++)
{
vector <int> ask;
for(int j = 0;j<m;j++) ask.push_back(cell2Pos(i, j));
v.push_back(add_xor(ask));
}
Number A = getDiff(v);
v.clear();
for(int j = 0;j<m;j++)
{
vector <int> ask;
for(int i = 0;i<n;i++) ask.push_back(cell2Pos(i, j));
v.push_back(add_xor(ask));
}
Number B = getDiff(v);
Number sum = A + B;
vector <int> requirements;
for(int bit = 0;bit<MAXLog;bit++)
{
int val = (((k>>bit)&1)==0?zero:one);
requirements.push_back(add_not(add_xor({val, sum[bit]})));
}
add_and(requirements);
}