Submission #596618

#TimeUsernameProblemLanguageResultExecution timeMemory
596618TemmieVision Program (IOI19_vision)C++17
8 / 100
3 ms1580 KiB
#include "vision.h" #include <bits/stdc++.h> struct Case { int i, j; std::vector <std::pair <int, int>> can; }; constexpr const int di[4] = { 1, -1, 0, 0 }; constexpr const int dj[4] = { 0, 0, 1, -1 }; constexpr bool ok(int i, int j, int n, int m) { return i >= 0 && j >= 0 && i < n && j < m; } std::vector <std::pair <int, int>> get(int n, int m, int k, int si, int sj) { std::vector <std::pair <int, int>> res; std::queue <std::pair <int, std::pair <int, int>>> q; std::vector <std::vector <bool>> vis(n, std::vector <bool> (m, false)); q.push({ 0, { si, sj } }); while (q.size()) { int w = q.front().first; int i = q.front().second.first; int j = q.front().second.second; q.pop(); if (!ok(i, j, n, m) || vis[i][j]) { continue; } vis[i][j] = true; if (w == k) { res.emplace_back(i, j); } if (w < k) { for (int d = 0; d < 4; d++) { q.push({ w + 1, { i + di[d], j + dj[d] } }); } } } return res; } std::vector <int> conv(int m, const std::vector <std::pair <int, int>>& a) { std::vector <int> res(a.size()); for (int i = 0; i < (int) a.size(); i++) { res[i] = a[i].first * m + a[i].second; } return res; } void construct_network(int n, int m, int k) { std::vector <std::vector <Case>> cas(n, std::vector <Case> (m)); std::vector <int> or_last; //if (k == 1) { //std::vector <int> a, b; //for (int i = 0; i < n; i++) { //for (int j = 0; j < m; j++) { //if ((i + j) & 1) a.push_back(i * m + j); //else b.push_back(i * m + j); //} //} //int ind1 = add_or(a); //int ind2 = add_or(a); //add_and({ ind1, ind2 }); //return; //} std::map <std::vector <std::pair <int, int>>, int> mp; for (int i = 0; i < 1; i++) { for (int j = 0; j < 1; j++) { cas[i][j].i = i; cas[i][j].j = j; cas[i][j].can = get(n, m, k, i, j); std::sort(cas[i][j].can.begin(), cas[i][j].can.end()); if (cas[i][j].can.empty()) { continue; } auto it = mp.find(cas[i][j].can); int ind1; if (it != mp.end()) { ind1 = it->second; } else { ind1 = add_or(conv(m, cas[i][j].can)); mp[cas[i][j].can] = ind1; } int ind2 = add_and({ ind1, i * m + j }); or_last.push_back(ind2); } } assert(or_last.size()); add_or(or_last); }
#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...