Submission #1185660

#TimeUsernameProblemLanguageResultExecution timeMemory
1185660anmattroiVision Program (IOI19_vision)C++17
100 / 100
51 ms9408 KiB
#include "vision.h" #include <bits/stdc++.h> using namespace std; //add_and //add_or //add_xor //add_not vector<int> operator + (vector<int> a, vector<int> b) { vector<int> ans(a.begin(), a.end()); for (int i : b) ans.emplace_back(i); return ans; } struct node {int x, y, idx; node() {} node(int _x, int _y, int _idx) : x(_x), y(_y), idx(_idx) {} }; vector<node> nodes; vector<int> A, B; vector<int> C, D; int solveFirstCase(int H, int W, int K) { int conditionOne, conditionTwo; if (1) { vector<int> p; for (int i1 = 0, i2 = 0; i1 < C.size(); i1++) { while (i2 < C.size() && C[i2]-C[i1] <= K) ++i2; --i2; if (i1 == i2) continue; vector<int> o; for (int i = i1; i <= i2; i++) o.emplace_back(A[i]); p.emplace_back(add_and({add_not(add_xor(o)), add_or(o)})); } conditionTwo = add_or(p + vector<int>{add_xor(A)}); } if (1) { vector<int> p, q; for (int i1 = 0, i2 = 0; i1 < D.size(); i1++) { while (i2 < D.size() && D[i2]-D[i1] <= K) ++i2; --i2; if (D[i2]-D[i1] != K) continue; vector<int> o; for (int i = i1; i <= i2; i++) o.emplace_back(B[i]); p.emplace_back(add_and({add_not(add_xor(o)), add_or(o)})); } if (K != 1) { for (int i1 = 0, i2 = 0; i1 < D.size(); i1++) { while (i2 < D.size() && D[i2]-D[i1] < K) ++i2; --i2; if (i1 == i2) continue; vector<int> o; for (int i = i1; i <= i2; i++) o.emplace_back(B[i]); q.emplace_back(add_and({add_not(add_xor(o)), add_or(o)})); } conditionOne = add_and(vector<int>{add_or(p)} + vector<int>{add_not(add_or(q))}); } else conditionOne = add_or(p); } return add_and({conditionOne, conditionTwo}); } int solveSecondCase(int H, int W, int K) { int conditionOne, conditionTwo; if (1) { vector<int> p; for (int i1 = 0, i2 = 0; i1 < D.size(); i1++) { while (i2 < D.size() && D[i2]-D[i1] <= K) ++i2; --i2; if (i1 == i2) continue; vector<int> o; for (int i = i1; i <= i2; i++) o.emplace_back(B[i]); p.emplace_back(add_and({add_not(add_xor(o)), add_or(o)})); } conditionTwo = add_or(p + vector<int>{add_xor(B)}); } if (1) { vector<int> p, q; for (int i1 = 0, i2 = 0; i1 < C.size(); i1++) { while (i2 < C.size() && C[i2]-C[i1] <= K) ++i2; --i2; if (C[i2]-C[i1] != K) continue; vector<int> o; for (int i = i1; i <= i2; i++) o.emplace_back(A[i]); p.emplace_back(add_and({add_not(add_xor(o)), add_or(o)})); } if (K != 1) { for (int i1 = 0, i2 = 0; i1 < C.size(); i1++) { while (i2 < C.size() && C[i2]-C[i1] < K) ++i2; --i2; if (i1 == i2) continue; vector<int> o; for (int i = i1; i <= i2; i++) o.emplace_back(A[i]); q.emplace_back(add_and({add_not(add_xor(o)), add_or(o)})); } conditionOne = add_and(vector<int>{add_or(p)} + vector<int>{add_not(add_or(q))}); } else conditionOne = add_or(p); } return add_and({conditionOne, conditionTwo}); } void construct_network(int H, int W, int K) { nodes.clear(); A.clear(); B.clear(); C.clear(); D.clear(); for (int i = 0; i < H; i++) for (int j = 0; j < W; j++) { int x = i-j, y = i+j, idx = i*W+j; nodes.emplace_back(x, y, idx); } sort(nodes.begin(), nodes.end(), [&](const node &a, const node &b) { return a.x < b.x; }); for (int i2 = 0; i2 < nodes.size();) { int i1 = i2; vector<int> nho; while (i2 < nodes.size() && nodes[i2].x == nodes[i1].x) { nho.emplace_back(nodes[i2].idx); ++i2; } A.emplace_back(add_or(nho)); C.emplace_back(nodes[i1].x); } sort(nodes.begin(), nodes.end(), [&](const node &a, const node &b) { return a.y < b.y; }); for (int i2 = 0; i2 < nodes.size();) { int i1 = i2; vector<int> nho; while (i2 < nodes.size() && nodes[i2].y == nodes[i1].y) { nho.emplace_back(nodes[i2].idx); ++i2; } B.emplace_back(add_or(nho)); D.emplace_back(nodes[i1].y); } add_or({solveFirstCase(H, W, K), solveSecondCase(H, W, K)}); }
#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...