Submission #581115

#TimeUsernameProblemLanguageResultExecution timeMemory
581115drdilyorVision Program (IOI19_vision)C++17
32 / 100
4 ms1364 KiB
#if defined(ONPC) && !defined(_GLIBCXX_ASSERTIONS) #define _GLIBCXX_ASSERTIONS #endif #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/detail/standard_policies.hpp> #ifdef ONPC #define cerr cout #include "t_debug.cpp" #else #define debug(...) 42 #endif #define allit(a) (a).begin(), (a).end() #define sz(a) ((int) (a).size()) #include "vision.h" using namespace std; using ll = long long; using vi = vector<int>; namespace pd = __gnu_pbds; template<typename K> using ordered_set = pd::tree<K, pd::null_type, less<int>, pd::rb_tree_tag, pd::tree_order_statistics_node_update>; template<typename... T> using gp_hash_table = pd::gp_hash_table<T...>;//simple using statement gives warnings const int INF = 1e9; const ll INFL = 1e18; const int N = 1e5; const int RANDOM = chrono::high_resolution_clock::now().time_since_epoch().count(); mt19937 rng(RANDOM); #define ENC(i,j) ((i) * m + (j)) void construct_network(int n, int m, int dist) { vi diag1(n+m), diag2(n+m); for (int i = 0; i < n + m; i++) { vi pos; for (int j = 0; j <= i; j++) { int row = j, col = i - j; if (0 <= row && row < n && 0 <= col && col < m) { pos.push_back(ENC(row, col)); } } diag1[i] = pos.empty() ? -1 : add_or(pos); } for (int d = 0; d < n+m; d++) { vi pos; for (int i = 0, j = d - n; i < n && j < m; i++, j++) { if (j >= 0) { pos.push_back(ENC(i, j)); } } diag2[d] = pos.empty() ? -1 : add_or(pos); } vi bylen(n +m); vi pos; auto check = [&](vi& diag, int i, int j) { if (0 <= i && i < sz(diag) && diag[i] != -1 && 0 <= j && j < sz(diag) && diag[j] != -1) { int cur = add_and({diag[i], diag[j]}); pos.push_back(cur); } }; for (int len = dist; len < n + m; len++) { pos.clear(); for (int i = 0; i < sz(diag1); i++) { check(diag1, i, i - len); check(diag1, i, i + len); check(diag2, i, i - len); check(diag2, i, i + len); } bylen[len] = pos.empty() ? -1 : add_or(pos); } vi res = {bylen[dist]}; for (int i = dist+1; i < sz(bylen); i++) { if (bylen[i] != -1) res.push_back(add_not(bylen[i])); } add_and(res); return; if (n * m * 4 + dist * 4 < 10000) { vi pos; char added[n*m][n*m]; memset(added, 0, sizeof(added)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { for (int ii = 0; ii < n; ii++) { for (int jj = 0; jj < m; jj++) { int a = ENC(i, j); int b = ENC(ii, jj); if (a > b) swap(a, b); if (abs(ii-i) + abs(jj-j) == dist && !added[a][b]) { pos.push_back(add_and({a, b})); added[a][b] = 1; } } } } } for (int i = 1, prev = pos[0]; i < sz(pos); i++) { prev = add_or({prev, pos[i]}); } } else { int prev = -1; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (i + j == dist) { if (prev == -1) prev = i*m + j; else prev = add_or({prev, i*m + j}); } } } add_and({prev, prev}); } } #undef ENC
#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...