#include <bits/stdc++.h> using namespace std; int zderzenia[500007]; vector <int> G[500007]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int a; cin >> a; vector < pair <int, int> > tab1; vector < pair <int, int> > tab2; int b, c, d; for(int i = 0; i < a; i++) { cin >> b >> c >> d; if(b == 1) { tab1.push_back(make_pair(c, d)); } else { tab2.push_back(make_pair(c, d)); } } for(int i = 0; i < tab1.size(); i++) { for(int x = 0; x < tab2.size(); x++) { if(tab1[i].first + tab2[x].second == tab2[x].first + tab1[i].second) { zderzenia[i]++; zderzenia[x + tab1.size()]++; G[i].push_back(x + tab1.size()); G[x + tab1.size()].push_back(i); } } } priority_queue < pair <int, int> > Q; for(int i = 0; i < tab1.size(); i++) { if(zderzenia[i] != 0) { Q.push(make_pair(zderzenia[i], i)); } } for(int i = 0; i < tab2.size(); i++) { if(zderzenia[i + tab1.size()] != 0) { Q.push(make_pair(zderzenia[i + tab1.size()], tab1.size() + i)); } } pair <int, int> p; int wyn = 0; while(Q.size()) { p = Q.top(); Q.pop(); if(p.first == zderzenia[p.second]) { zderzenia[p.second] = 0; wyn++; for(int i = 0; i < G[p.second].size(); i++) { zderzenia[G[p.second][i]]--; if(zderzenia[G[p.second][i]] != 0) { Q.push(make_pair(zderzenia[G[p.second][i]], G[p.second][i])); } } } } cout << wyn << endl; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include <bits/stdc++.h> using namespace std; int zderzenia[500007]; vector <int> G[500007]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int a; cin >> a; vector < pair <int, int> > tab1; vector < pair <int, int> > tab2; int b, c, d; for(int i = 0; i < a; i++) { cin >> b >> c >> d; if(b == 1) { tab1.push_back(make_pair(c, d)); } else { tab2.push_back(make_pair(c, d)); } } for(int i = 0; i < tab1.size(); i++) { for(int x = 0; x < tab2.size(); x++) { if(tab1[i].first + tab2[x].second == tab2[x].first + tab1[i].second) { zderzenia[i]++; zderzenia[x + tab1.size()]++; G[i].push_back(x + tab1.size()); G[x + tab1.size()].push_back(i); } } } priority_queue < pair <int, int> > Q; for(int i = 0; i < tab1.size(); i++) { if(zderzenia[i] != 0) { Q.push(make_pair(zderzenia[i], i)); } } for(int i = 0; i < tab2.size(); i++) { if(zderzenia[i + tab1.size()] != 0) { Q.push(make_pair(zderzenia[i + tab1.size()], tab1.size() + i)); } } pair <int, int> p; int wyn = 0; while(Q.size()) { p = Q.top(); Q.pop(); if(p.first == zderzenia[p.second]) { zderzenia[p.second] = 0; wyn++; for(int i = 0; i < G[p.second].size(); i++) { zderzenia[G[p.second][i]]--; if(zderzenia[G[p.second][i]] != 0) { Q.push(make_pair(zderzenia[G[p.second][i]], G[p.second][i])); } } } } cout << wyn << endl; return 0; } |