Submission #977862

#TimeUsernameProblemLanguageResultExecution timeMemory
977862opPOVision Program (IOI19_vision)C++14
66 / 100
26 ms2364 KiB
#include "vision.h" #include <bits/stdc++.h> using namespace std; int h, w, k; pair<int, int> get_by_index(int i) { return make_pair(i / w, i % w); } int dist(int x1, int y1, int x2, int y2) { return abs(x1 - x2) + abs(y1 - y2); } void construct_network(int H, int W, int K) { h = H; w = W; k = K; if (k == 1) { map<int, vector<int>> fd; map<int, vector<int>> sd; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { fd[i + j].push_back(i * w + j); sd[i - j].push_back(i * w + j); } } vector<pair<int, int>> first_diag; for (int fir = 0; fir <= h + w; fir++) { if (!fd[fir].empty()) { first_diag.push_back({fir, add_or(fd[fir])}); } } vector<pair<int, int>> second_diag; for (int sec = -(h + w); sec <= h + w; sec++) { if (!sd[sec].empty()) { second_diag.push_back({sec, add_or(sd[sec])}); } } sort(first_diag.begin(), first_diag.end()); sort(second_diag.begin(), second_diag.end()); vector<int> vf, vd; for (int i = 0; i < (int)first_diag.size() - 1; i++) { if (first_diag[i + 1].first - first_diag[i].first == 1) { vf.push_back(add_and({first_diag[i].second, first_diag[i + 1].second})); } } for (int i = 0; i < (int)second_diag.size() - 1; i++) { if (second_diag[i + 1].first - second_diag[i].first == 1) { vd.push_back(add_and({second_diag[i].second, second_diag[i + 1].second})); } } add_and({add_or(vf), add_or(vd)}); return; } vector<int> cells; if (min(h, w) != 1 && max(h, w) > 100) { for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (dist(0, 0, i, j) == k) { cells.push_back(add_and({0, i * w + j})); } } } } else { vector<pair<int, int>> order; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { order.push_back({i, j}); } } mt19937 gen(time(nullptr)); shuffle(order.begin(), order.end(), gen); int cnt = 0; for (auto &p : order) { if (cnt >= 9995) break; int i1 = p.first; int j1 = p.second; vector<int> diag; for (int i2 = i1; i2 < h; i2++) { for (int j2 = 0; j2 < w; j2++) { if (dist(i1, j1, i2, j2) == k) { diag.push_back(i2 * w + j2); } } } if (!diag.empty()) { cells.push_back(add_and({add_not(add_not(i1 * w + j1)), add_or(diag)})); cnt += 4; } } } add_or(cells); } /* g++ -std=gnu++14 -O2 -Wall -pipe -static -o "vision" "grader.cpp" "vision.cpp" */
#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...