#include <bits/stdc++.h> using namespace std; pair<int,int> kraw[50001]; //kraw (ilosc krawedzi, nr wierz) int d1[500001],d2[500001]; vector<int> l[500001]; set < pair<int,int> > wierzch; int wyszukaj_pocz(int t[], int l, int p, int sz){ while(l < p) { int s = (l + p)/2; if (sz > t[s]) l = s + 1; else p = s; } if (t[l] == sz) return l; return -1; } int wyszukaj_kon(int t[], int l, int p, int sz){ while(l < p) { int s = (l + p + 1)/2; if (sz >= t[s]) l = s; else p = s - 1 ; } if (t[l] == sz) return l; return -1; } int main() { ios_base::sync_with_stdio(0); int n, i, j, r, w, t,id1 = 0, id2 = 0,s1,s2,wyn=0; long long su1=0; cin >> n; for(i = 0; i < n;i++){ cin >> r >> w >> t; if(r == 1) { d1[id1] = w - t;id1++; su1 +=w-t; } else { d2[id2] = w - t;id2++; } } s1 = id1; s2 = id2; if (su1/s1 == s2) { cout << min(s1,s2) ; return 0; } sort(d2,d2+s2); for(i = 0 ; i < s1;i++) { j = wyszukaj_pocz(d2,0, s2-1,d1[i]);//poczatek stluczek if(j >= 0) { while(j < s2 && d2[j] == d1[i]){ l[i].push_back(s1+j); l[s1+j].push_back(i); j++; } } } for(i = 0; i < n; i++) { kraw[i].first = -l[i].size(); kraw[i].second = i; if(kraw[i].first < 0) wierzch.insert(kraw[i]); } set<pair<int,int> > ::iterator result, it; while(!wierzch.empty()){ int ile, nr; ile = wierzch.begin()->first; nr = wierzch.begin()->second; wierzch.erase(wierzch.begin()); wyn++; for(i= 0;i <l[nr].size();i++){ int ktory = l[nr][i]; result = wierzch.find(kraw[ktory]); if(result != wierzch.end()) wierzch.erase(result); kraw[ktory].first++; if (kraw[ktory].first < 0) wierzch.insert(kraw[ktory]); } } cout << wyn; 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 | #include <bits/stdc++.h> using namespace std; pair<int,int> kraw[50001]; //kraw (ilosc krawedzi, nr wierz) int d1[500001],d2[500001]; vector<int> l[500001]; set < pair<int,int> > wierzch; int wyszukaj_pocz(int t[], int l, int p, int sz){ while(l < p) { int s = (l + p)/2; if (sz > t[s]) l = s + 1; else p = s; } if (t[l] == sz) return l; return -1; } int wyszukaj_kon(int t[], int l, int p, int sz){ while(l < p) { int s = (l + p + 1)/2; if (sz >= t[s]) l = s; else p = s - 1 ; } if (t[l] == sz) return l; return -1; } int main() { ios_base::sync_with_stdio(0); int n, i, j, r, w, t,id1 = 0, id2 = 0,s1,s2,wyn=0; long long su1=0; cin >> n; for(i = 0; i < n;i++){ cin >> r >> w >> t; if(r == 1) { d1[id1] = w - t;id1++; su1 +=w-t; } else { d2[id2] = w - t;id2++; } } s1 = id1; s2 = id2; if (su1/s1 == s2) { cout << min(s1,s2) ; return 0; } sort(d2,d2+s2); for(i = 0 ; i < s1;i++) { j = wyszukaj_pocz(d2,0, s2-1,d1[i]);//poczatek stluczek if(j >= 0) { while(j < s2 && d2[j] == d1[i]){ l[i].push_back(s1+j); l[s1+j].push_back(i); j++; } } } for(i = 0; i < n; i++) { kraw[i].first = -l[i].size(); kraw[i].second = i; if(kraw[i].first < 0) wierzch.insert(kraw[i]); } set<pair<int,int> > ::iterator result, it; while(!wierzch.empty()){ int ile, nr; ile = wierzch.begin()->first; nr = wierzch.begin()->second; wierzch.erase(wierzch.begin()); wyn++; for(i= 0;i <l[nr].size();i++){ int ktory = l[nr][i]; result = wierzch.find(kraw[ktory]); if(result != wierzch.end()) wierzch.erase(result); kraw[ktory].first++; if (kraw[ktory].first < 0) wierzch.insert(kraw[ktory]); } } cout << wyn; return 0; } |