Submission #362457

#TimeUsernameProblemLanguageResultExecution timeMemory
362457mihai145Vision Program (IOI19_vision)C++14
0 / 100
46 ms5024 KiB
#include "vision.h" #include <vector> using namespace std; const int NMAX = 400; const int CT = 200; int _H, _W; int Get_Index(int x, int y) { return x * _H + y; } vector <int> diagPlus[NMAX + 5], diagMinus[NMAX + 5]; int resDiagPlus[NMAX + 5], resDiagMinus[NMAX + 5]; int prefPlus[NMAX + 5], sufPlus[NMAX + 5]; int prefMinus[NMAX + 5], sufMinus[NMAX + 5]; void construct_network(int H, int W, int K) { _H = H; _W = W; for(int i = 0; i < H; i++) for(int j = 0; j < W; j++) { diagPlus[i + j].push_back(Get_Index(i, j)); diagMinus[i - j + CT].push_back(Get_Index(i, j)); } ///DiagPlus for(int i = 0; i <= H + W; i++) if((int)diagPlus[i].size() > 0) { vector<int>Ns; for(auto it : diagPlus[i]) Ns.push_back(it); resDiagPlus[i] = add_or(Ns); } ///DiagMinus for(int i = -W; i <= H; i++) if((int)diagMinus[i + CT].size() > 0) { vector<int>Ns; for(auto it : diagMinus[i + CT]) Ns.push_back(it); resDiagMinus[i + CT] = add_or(Ns); } ///DiagPlus L->R for(int i = 0; i <= H + W; i++) if((int)diagPlus[i].size() > 0) { ///Prefix OR 0...i vector <int> Ns; for(int j = 0; j <= i; j++) { Ns.push_back(resDiagPlus[j]); } prefPlus[i] = add_or(Ns); } ///DiagPlus R->L for(int i = H + W - 2; i >= 0; i--) { ///Suffix OR i...H+W-2 vector <int> Ns; for(int j = i; j <= H + W - 2; j++) { Ns.push_back(resDiagPlus[j]); } sufPlus[i] = add_or(Ns); } ///DiagMinus L->R for(int i = -W + 1; i <= H - 1; i++) { ///Prefix OR -W+1...i vector <int> Ns; for(int j = -W + 1; j <= i; j++) { Ns.push_back(resDiagMinus[j + CT]); } prefMinus[i + CT] = add_or(Ns); } ///DiagMinus R->L for(int i = H - 1; i >= -W + 1; i--) { ///Suffix OR i...H-1 vector <int> Ns; for(int j = i; j <= H - 1; j++) { Ns.push_back(resDiagMinus[j + CT]); } sufMinus[i + CT] = add_or(Ns); } ///CASE 1: diagPlus is 1 at a distance of K and diagMinus is 1 at a distance of at most K ///CODE HERE... int res1 = -1; vector <int> resAnds; for(int i = 0; i <= W + H - 2 - K; i++) { vector<int> Ns; Ns.push_back(resDiagPlus[i]); Ns.push_back(resDiagPlus[i + K]); resAnds.push_back(add_and(Ns)); } int isDiagPlusAtDistanceK = add_or(resAnds); resAnds.clear(); for(int l = -W + 1; l <= H - 1 - K; l++) { vector <int> Ns; if(l - 1 >= -W + 1) { Ns.push_back(prefMinus[l - 1 + CT]); } if(l + K + 1 <= H - 1) { Ns.push_back(sufMinus[l + K + 1 + CT]); } if((int)Ns.size() > 0) { int fsp = add_or(Ns); resAnds.push_back(add_not(fsp)); } } int isDiagMinusAtDistanceAtMostK = add_or(resAnds); res1 = add_and({isDiagPlusAtDistanceK, isDiagMinusAtDistanceAtMostK}); ///CASE 2: diagMinus is 1 at a distance of K and diagPlus is 1 at a distance of at most K ///CODE HERE... int res2 = -1; resAnds.clear(); for(int i = -W + 1; i <= H - 1 - K; i++) { vector<int> Ns; Ns.push_back(resDiagMinus[i + CT]); Ns.push_back(resDiagMinus[i + K + CT]); resAnds.push_back(add_and(Ns)); } int isDiagMinusAtDistanceK = add_or(resAnds); resAnds.clear(); for(int l = 0; l <= H + W - 2 - K; l++) { vector <int> Ns; if(l - 1 >= 0) { Ns.push_back(prefPlus[l - 1]); } if(l + K + 1 <= H + W - 2) { Ns.push_back(sufPlus[l + K + 1]); } if((int)Ns.size() > 0) { int fsp = add_or(Ns); resAnds.push_back(add_not(fsp)); } } int isDiagPlusAtDistanceAtMostK = add_or(resAnds); res2 = add_and({isDiagMinusAtDistanceK, isDiagPlusAtDistanceAtMostK}); add_or({res1, res2}); /* std::vector<int> Ns; Ns = {0, 1}; int a = add_and(Ns); Ns = {0, a}; int b = add_or(Ns); Ns = {0, 1, b}; int c = add_xor(Ns); add_not(c); */ }
#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...