Submission #246997

#TimeUsernameProblemLanguageResultExecution timeMemory
246997stoyan_malininVision Program (IOI19_vision)C++14
100 / 100
34 ms2492 KiB
#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 r*m + 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 (stderr)

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++)
                   ~^~~~~~~~~
#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...