Task: | Apartments |
Sender: | marttini |
Submission time: | 2024-09-06 13:45:44 +0300 |
Language: | C++ (C++11) |
Status: | READY |
Result: | TIME LIMIT EXCEEDED |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.02 s | details |
#2 | ACCEPTED | 0.02 s | details |
#3 | ACCEPTED | 0.02 s | details |
#4 | ACCEPTED | 0.02 s | details |
#5 | TIME LIMIT EXCEEDED | -- | details |
#6 | TIME LIMIT EXCEEDED | -- | details |
#7 | TIME LIMIT EXCEEDED | -- | details |
#8 | TIME LIMIT EXCEEDED | -- | details |
#9 | ACCEPTED | 0.02 s | details |
#10 | ACCEPTED | 0.02 s | details |
#11 | ACCEPTED | 0.02 s | details |
#12 | ACCEPTED | 0.02 s | details |
#13 | TIME LIMIT EXCEEDED | -- | details |
#14 | TIME LIMIT EXCEEDED | -- | details |
#15 | TIME LIMIT EXCEEDED | -- | details |
#16 | TIME LIMIT EXCEEDED | -- | details |
#17 | WRONG ANSWER | 0.05 s | details |
#18 | ACCEPTED | 0.02 s | details |
#19 | ACCEPTED | 0.02 s | details |
Code
#include <bits/stdc++.h> // book copy-pasta const int N = 10e5; std::vector<int> adj[N]; bool visited[N]; int matching[N]; // additional // modified bool dfs(int s) { visited[s] = true; // go through neighbors for (auto u: adj[s]) { if (visited[u]) continue; if (matching[u] == -1) { // reached a node at the end of an alternating path that ends in a free node matching[s] = u; matching[u] = s; return true; } if (matching[u] != s) { // make sure we don't revisit the same match in the DFS visited[u] = true; if (dfs(matching[u])) { matching[s] = u; matching[u] = s; return true; } } } return false; } // i.e. maximum bipartite matching void apartments() { int n, m, k; std::cin >> n >> m >> k; std::vector<int> desired(n); for (int i = 0; i < n; i++) { std::cin >> desired[i]; } std::vector<int> apartments(m); for (int i = 0; i < m; i++) { std::cin >> apartments[i]; } // model as bipartite graph // - applicants as nodes on the left // - apartments as nodes on the right // - edge between applicant and apartment if apartment is ok for applicant for (int i = 0; i < n; i++) { int applicant_desired = desired[i]; for (int j = 0; j < m; j++) { int apt = apartments[j]; int apt_i = n + j; if (applicant_desired >= apt - k && applicant_desired <= apt + k) { // add both directions adj[i].push_back(apt_i); adj[apt_i].push_back(i); } } } // mark all nodes as unvisited and unmatched for (int i = 0; i < n * m; i++) { matching[i] = -1; } // algorithm itself int count = 0; for (int i = 0; i < n; i++) { if (matching[i] == -1) { // mark everything unvisited for (int j = 0; j < n * m; j++) { visited[i] = false; } // preform dfs if (dfs(i)) count++; } } std::cout << count << std::endl; } int main() { std::basic_ostream<char, std::char_traits<char>>::sync_with_stdio(false); std::cin.exceptions(std::istream::failbit); apartments(); return 0; }
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: TIME LIMIT EXCEEDED
input |
---|
200000 200000 0 34 48 12 99 89 71 20 7 9 38 58... |
correct output |
---|
197286 |
user output |
---|
(empty) |
Test 6
Verdict: TIME LIMIT EXCEEDED
input |
---|
200000 200000 10 89 26 46 74 91 19 47 18 83 85 ... |
correct output |
---|
200000 |
user output |
---|
(empty) |
Test 7
Verdict: TIME LIMIT EXCEEDED
input |
---|
200000 200000 1000 71 84 11 90 70 59 60 11 52 65 ... |
correct output |
---|
200000 |
user output |
---|
(empty) |
Test 8
Verdict: TIME LIMIT EXCEEDED
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: WRONG ANSWER
input |
---|
199999 1 1 199996 199997 149999 117797 19... |
correct output |
---|
1 |
user output |
---|
0 |
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 |