#include "vision.h"
//#include "grader.cpp"
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
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);
}
Compilation message
vision.cpp: In function 'Number getDiff(std::vector<int>&)':
vision.cpp:101:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0;i<v.size();i++)
~^~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Incorrect |
5 ms |
256 KB |
WA in grader: Invalid index |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Incorrect |
5 ms |
256 KB |
WA in grader: Invalid index |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Incorrect |
5 ms |
256 KB |
WA in grader: Invalid index |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Incorrect |
5 ms |
256 KB |
WA in grader: Invalid index |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
660 KB |
Output is correct |
2 |
Correct |
7 ms |
640 KB |
Output is correct |
3 |
Correct |
7 ms |
640 KB |
Output is correct |
4 |
Correct |
6 ms |
640 KB |
Output is correct |
5 |
Incorrect |
5 ms |
256 KB |
WA in grader: Invalid index |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Incorrect |
5 ms |
384 KB |
WA in grader: Invalid index |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
25 ms |
2492 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Incorrect |
5 ms |
384 KB |
WA in grader: Invalid index |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
384 KB |
Output is correct |
2 |
Correct |
5 ms |
384 KB |
Output is correct |
3 |
Incorrect |
5 ms |
256 KB |
WA in grader: Invalid index |
4 |
Halted |
0 ms |
0 KB |
- |