Task: | Apartments |
Sender: | peik-e |
Submission time: | 2024-09-11 14:13:18 +0300 |
Language: | C++ (C++20) |
Status: | READY |
Result: | RUNTIME ERROR |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.00 s | details |
#2 | ACCEPTED | 0.00 s | details |
#3 | ACCEPTED | 0.00 s | details |
#4 | ACCEPTED | 0.00 s | details |
#5 | RUNTIME ERROR | 0.92 s | details |
#6 | RUNTIME ERROR | 0.92 s | details |
#7 | RUNTIME ERROR | 0.92 s | details |
#8 | RUNTIME ERROR | 0.92 s | details |
#9 | ACCEPTED | 0.00 s | details |
#10 | ACCEPTED | 0.00 s | details |
#11 | ACCEPTED | 0.00 s | details |
#12 | ACCEPTED | 0.01 s | details |
#13 | TIME LIMIT EXCEEDED | -- | details |
#14 | TIME LIMIT EXCEEDED | -- | details |
#15 | TIME LIMIT EXCEEDED | -- | details |
#16 | TIME LIMIT EXCEEDED | -- | details |
#17 | ACCEPTED | 0.24 s | details |
#18 | ACCEPTED | 0.00 s | details |
#19 | ACCEPTED | 0.00 s | details |
Code
#include <algorithm> #include <cassert> #include <cmath> #include <iostream> #include <iterator> #include <limits> #include <set> #include <tuple> #include <utility> #include <vector> using namespace std; template <typename T> std::ostream &operator<<(std::ostream &os, const vector<T> &obj) { bool first = true; for (const auto &o : obj) { if (first) { cout << o; first = false; } else { cout << ' ' << o; } } cout << endl; return os; } std::ostream &operator<<(std::ostream &os, const vector<pair<int, int>> &obj) { for (const auto &o : obj) { cout << o.first << ' ' << o.second << endl; } cout << endl; return os; } // {adjacent, adjacents_idx(self), weight} vector<vector<tuple<int, int, int>>> adjacency; set<int> seen; int source, drain; bool _ff_dfs(int node, int minimum, vector<tuple<int, int, int> *> &out) { seen.insert(node); // cout << "dfs(" << node << ')' << endl; for (auto &adj : adjacency[node]) { auto &[nb, rev, w] = adj; // cout << "nb: " << nb << endl; if (w <= minimum) { continue; } if (seen.contains(nb)) { continue; } if (nb == drain || _ff_dfs(nb, minimum, out)) { out.push_back(&adj); // cout << "<" << endl; return true; } // cout << "<" << endl; } return false; } float max_flow(int init_threshhold) { float total = 0; vector<tuple<int, int, int> *> path_adj; while (init_threshhold > 0) { while (_ff_dfs(source, init_threshhold - 1, path_adj)) { // cout << "dfs ran" << endl; int minimum = numeric_limits<int>::max(); for (const auto ptr : path_adj) { int w = get<2>(*ptr); minimum = min(w, minimum); } // cout << "minimum: " << minimum << endl; for (auto ptr : path_adj) { auto &[nb, rev, w] = *ptr; auto &rev_w = get<2>(adjacency[nb][rev]); w -= minimum; rev_w += minimum; } total += minimum; // cout << "total: " << total << endl; path_adj.clear(); seen.clear(); } init_threshhold >>= 1; } return total; } int matchings(int left, int right, const vector<pair<int, int>> &edges) { adjacency = vector<vector<tuple<int, int, int>>>( left + right + 2, vector<tuple<int, int, int>>(0)); source = left + right; drain = left + right + 1; auto edge = [&](int a, int b) { int rev_fwd = adjacency[b].size(); int rev_back = adjacency[a].size(); adjacency[a].push_back({b, rev_fwd, 1}); adjacency[b].push_back({a, rev_back, 0}); }; for (int i = 0; i < left; ++i) { edge(source, i); } for (int i = 0; i < right; ++i) { edge(left + i, drain); } for (const auto &e : edges) { edge(e.first, e.second + left); } return max_flow(left + right); } int main(int argc, char **argv) { int n, m, k; cin >> n >> m >> k; vector<int> desired_size(n); vector<int> sizes(m); for (int i = 0; i < n; ++i) cin >> desired_size[i]; for (int i = 0; i < m; ++i) cin >> sizes[i]; sort(sizes.begin(), sizes.end()); vector<pair<int, int>> edges; for (int i = 0; i < n; ++i) { int des = desired_size[i]; auto lo = lower_bound(sizes.begin(), sizes.end(), des - k); auto hi = upper_bound(sizes.begin(), sizes.end(), des + k); for (; lo < hi; ++lo) { edges.push_back({i, distance(sizes.begin(), lo)}); } } cout << matchings(n, m, edges) << endl; }
Test details
Test 1
Verdict: ACCEPTED
input |
---|
10 10 0 37 62 56 69 34 46 10 86 16 49 50 95 47 43 9 62 83 71 71 7 |
correct output |
---|
1 |
user output |
---|
1 |
Test 2
Verdict: ACCEPTED
input |
---|
10 10 10 90 41 20 39 49 21 35 31 74 86 14 24 24 7 82 85 82 4 60 95 |
correct output |
---|
6 |
user output |
---|
6 |
Test 3
Verdict: ACCEPTED
input |
---|
10 10 1000 59 5 65 15 42 81 58 96 50 1 18 59 71 65 97 83 80 68 92 67 |
correct output |
---|
10 |
user output |
---|
10 |
Test 4
Verdict: ACCEPTED
input |
---|
10 10 1000000000 25 80 59 43 67 21 77 5 8 99 66 41 62 24 88 55 1 53 50 60 |
correct output |
---|
10 |
user output |
---|
10 |
Test 5
Verdict: RUNTIME ERROR
input |
---|
200000 200000 0 34 48 12 99 89 71 20 7 9 38 58... |
correct output |
---|
197286 |
user output |
---|
(empty) |
Test 6
Verdict: RUNTIME ERROR
input |
---|
200000 200000 10 89 26 46 74 91 19 47 18 83 85 ... |
correct output |
---|
200000 |
user output |
---|
(empty) |
Test 7
Verdict: RUNTIME ERROR
input |
---|
200000 200000 1000 71 84 11 90 70 59 60 11 52 65 ... |
correct output |
---|
200000 |
user output |
---|
(empty) |
Test 8
Verdict: RUNTIME ERROR
input |
---|
200000 200000 1000000000 21 94 92 4 12 5 38 47 59 92 2 ... |
correct output |
---|
200000 |
user output |
---|
(empty) |
Test 9
Verdict: ACCEPTED
input |
---|
10 10 0 727245017 647121519 549745115 ... |
correct output |
---|
0 |
user output |
---|
0 |
Test 10
Verdict: ACCEPTED
input |
---|
10 10 10 30734435 218114477 257355293 4... |
correct output |
---|
0 |
user output |
---|
0 |
Test 11
Verdict: ACCEPTED
input |
---|
10 10 1000 7899629 162004163 327616450 51... |
correct output |
---|
0 |
user output |
---|
0 |
Test 12
Verdict: ACCEPTED
input |
---|
10 10 1000000000 725746771 537157640 742868604 ... |
correct output |
---|
10 |
user output |
---|
10 |
Test 13
Verdict: TIME LIMIT EXCEEDED
input |
---|
200000 200000 0 375495587 322263536 985991668 ... |
correct output |
---|
42 |
user output |
---|
(empty) |
Test 14
Verdict: TIME LIMIT EXCEEDED
input |
---|
200000 200000 10 906603621 968136956 666786366 ... |
correct output |
---|
846 |
user output |
---|
(empty) |
Test 15
Verdict: TIME LIMIT EXCEEDED
input |
---|
200000 200000 1000 215460174 880023362 242442952 ... |
correct output |
---|
57149 |
user output |
---|
(empty) |
Test 16
Verdict: TIME LIMIT EXCEEDED
input |
---|
200000 200000 1000000000 50349580 773460492 440699400 8... |
correct output |
---|
200000 |
user output |
---|
(empty) |
Test 17
Verdict: ACCEPTED
input |
---|
199999 1 1 199996 199997 149999 117797 19... |
correct output |
---|
1 |
user output |
---|
1 |
Test 18
Verdict: ACCEPTED
input |
---|
5 2 2 2 2 2 40 50 40 50 |
correct output |
---|
2 |
user output |
---|
2 |
Test 19
Verdict: ACCEPTED
input |
---|
4 3 5 60 45 80 60 30 60 75 |
correct output |
---|
2 |
user output |
---|
2 |