#include <iostream> #include <algorithm> #include <cmath> #include <vector> using namespace std; struct iTree { vector <int> tab; iTree () { tab.resize(1<<17, 0); } void repair (int x){ while (x >= 1){ x = x>>1; tab[x] = max (tab[x*2], tab[x*2+1]); } } void add (int x, int a){ tab[x+(1<<16)] = max (tab[x+(1<<16)], a); repair (x+(1<<16)); } int maxi (int a, int b, int s, int e, int v){ if (a == s && b == e) return tab[v]; int c = (s+e)>>1; if (a >= c) return maxi (a, b, c, e, v*2+1); else if (b < c) return maxi (a, b, s, c, v*2); else return max (maxi(a, c, s, c, v*2), maxi(c, b, c, e, v*2+1)); } }; vector <pair <int, int> > read_starting_poztions (int number_of_cars, vector <int> &cars_height){ vector <pair <int, int> > starting_pozitions (number_of_cars, make_pair(0,0)); cars_height.resize(number_of_cars, 0); for (int i=0; i<number_of_cars; i++){ int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; cars_height[i] = abs (y1 - y2); starting_pozitions[i] = make_pair(min(x1, x2), i); } sort (starting_pozitions.begin(), starting_pozitions.end()); return starting_pozitions; } vector <pair <int, int> > read_ending_poztions (int number_of_cars){ vector <pair <int, int> > ending_pozitions(number_of_cars, make_pair(0,0)); for (int i=0; i<number_of_cars; i++){ int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; ending_pozitions[i] = make_pair(max(x1, x2), i); } sort (ending_pozitions.begin(), ending_pozitions.end()); return ending_pozitions; } vector <int> make_place (int number_of_cars, vector <pair <int, int> > ending_pozitions){ vector <int> place (number_of_cars, 0); for (int i=0; i<number_of_cars; i++) place[ending_pozitions[i].second] = i; return place; } bool tryit (int number_of_cars, vector <pair <int, int> > starting_pozitions, vector <int> place, vector <int> cars_height, int parking_height){ int car; iTree T; for (int i=0; i<number_of_cars; i++) { car = starting_pozitions[i].second; if (T.maxi(place[car]+(1<<16), 1<<17, 1<<16, 1<<17, 1) + cars_height[car] <= parking_height) T.add(place[car], cars_height[car]); else return false; } return true; } void solve (){ int number_of_cars, parking_height; cin >> number_of_cars >> parking_height; vector <pair <int, int> > starting_pozitions, ending_pozitions; vector <int> cars_height, place; starting_pozitions = read_starting_poztions(number_of_cars, cars_height); ending_pozitions = read_ending_poztions(number_of_cars); place = make_place(number_of_cars, ending_pozitions); if (tryit(number_of_cars, starting_pozitions, place, cars_height, parking_height)) cout << "TAK\n"; else cout << "NIE\n"; } int main(){ ios_base::sync_with_stdio(0); int t; cin >> t; for (int i=0; i<t; i++) solve(); 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 97 98 99 100 101 102 103 104 105 106 107 108 | #include <iostream> #include <algorithm> #include <cmath> #include <vector> using namespace std; struct iTree { vector <int> tab; iTree () { tab.resize(1<<17, 0); } void repair (int x){ while (x >= 1){ x = x>>1; tab[x] = max (tab[x*2], tab[x*2+1]); } } void add (int x, int a){ tab[x+(1<<16)] = max (tab[x+(1<<16)], a); repair (x+(1<<16)); } int maxi (int a, int b, int s, int e, int v){ if (a == s && b == e) return tab[v]; int c = (s+e)>>1; if (a >= c) return maxi (a, b, c, e, v*2+1); else if (b < c) return maxi (a, b, s, c, v*2); else return max (maxi(a, c, s, c, v*2), maxi(c, b, c, e, v*2+1)); } }; vector <pair <int, int> > read_starting_poztions (int number_of_cars, vector <int> &cars_height){ vector <pair <int, int> > starting_pozitions (number_of_cars, make_pair(0,0)); cars_height.resize(number_of_cars, 0); for (int i=0; i<number_of_cars; i++){ int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; cars_height[i] = abs (y1 - y2); starting_pozitions[i] = make_pair(min(x1, x2), i); } sort (starting_pozitions.begin(), starting_pozitions.end()); return starting_pozitions; } vector <pair <int, int> > read_ending_poztions (int number_of_cars){ vector <pair <int, int> > ending_pozitions(number_of_cars, make_pair(0,0)); for (int i=0; i<number_of_cars; i++){ int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; ending_pozitions[i] = make_pair(max(x1, x2), i); } sort (ending_pozitions.begin(), ending_pozitions.end()); return ending_pozitions; } vector <int> make_place (int number_of_cars, vector <pair <int, int> > ending_pozitions){ vector <int> place (number_of_cars, 0); for (int i=0; i<number_of_cars; i++) place[ending_pozitions[i].second] = i; return place; } bool tryit (int number_of_cars, vector <pair <int, int> > starting_pozitions, vector <int> place, vector <int> cars_height, int parking_height){ int car; iTree T; for (int i=0; i<number_of_cars; i++) { car = starting_pozitions[i].second; if (T.maxi(place[car]+(1<<16), 1<<17, 1<<16, 1<<17, 1) + cars_height[car] <= parking_height) T.add(place[car], cars_height[car]); else return false; } return true; } void solve (){ int number_of_cars, parking_height; cin >> number_of_cars >> parking_height; vector <pair <int, int> > starting_pozitions, ending_pozitions; vector <int> cars_height, place; starting_pozitions = read_starting_poztions(number_of_cars, cars_height); ending_pozitions = read_ending_poztions(number_of_cars); place = make_place(number_of_cars, ending_pozitions); if (tryit(number_of_cars, starting_pozitions, place, cars_height, parking_height)) cout << "TAK\n"; else cout << "NIE\n"; } int main(){ ios_base::sync_with_stdio(0); int t; cin >> t; for (int i=0; i<t; i++) solve(); return 0; } |