#include <iostream> #include <vector> #include <algorithm> using namespace std; struct less_than_key { inline bool operator() (const pair<int, int>& struct1, const pair<int, int> & struct2) { if(struct1.second == struct2.second){ return struct1.first < struct2.first; } return (struct1.second < struct2.second); } }; int main(){ int t; cin >> t; for(int i = 0; i< t; i ++){ int k; cin >> k; vector<pair<int,int>> herbs_expected; vector<pair<int,int>> herbs_delivered; for(int j = 0; j < k; j ++) { pair<int, int> tmp; cin >> tmp.first; cin >> tmp.second; herbs_delivered.push_back(tmp); cin >> tmp.second; herbs_expected.push_back(tmp); } std::sort(herbs_delivered.begin(), herbs_delivered.end(), less_than_key()); std::sort(herbs_expected.begin(), herbs_expected.end(), less_than_key()); int64_t leftmass = 0; int64_t leftheat = 0; int64_t lastmass = 0; int64_t lastheat = 0; int64_t soupmass = 0; int64_t soupheat = 0; bool possible = true; int left = 0; if(herbs_expected[0].second < herbs_delivered[0].second){ possible = false; } if(herbs_expected[herbs_expected.size() - 1].second > herbs_delivered[herbs_delivered.size() - 1].second){ possible = false; } for(int i = 0; i < herbs_expected.size() && possible; i++){ soupheat += herbs_expected[i].first * herbs_expected[i].second; soupmass += herbs_expected[i].first; while(left < herbs_expected.size() && (leftheat * soupmass) <= (soupheat * leftmass)) { lastmass = leftmass; lastheat = leftheat; leftmass += herbs_delivered[left].first; leftheat += herbs_delivered[left].first * herbs_delivered[left].second; left ++; } if(lastmass < soupmass && (lastheat * soupmass) < (soupheat * lastmass)){ int64_t leftt = soupmass - lastmass; if((lastheat + leftt * herbs_delivered[left - 1].second) > soupheat){ possible = false; break; } } if(leftmass < soupmass || (leftheat * soupmass) < (soupheat * leftmass)){ possible = false; break; } } if ((soupmass * leftheat) != (soupheat * leftmass) || leftmass != soupmass || left != herbs_expected.size()) { possible = false; } if(possible){ cout << "TAK" << endl; } else { cout << "NIE" << endl; } } }
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 | #include <iostream> #include <vector> #include <algorithm> using namespace std; struct less_than_key { inline bool operator() (const pair<int, int>& struct1, const pair<int, int> & struct2) { if(struct1.second == struct2.second){ return struct1.first < struct2.first; } return (struct1.second < struct2.second); } }; int main(){ int t; cin >> t; for(int i = 0; i< t; i ++){ int k; cin >> k; vector<pair<int,int>> herbs_expected; vector<pair<int,int>> herbs_delivered; for(int j = 0; j < k; j ++) { pair<int, int> tmp; cin >> tmp.first; cin >> tmp.second; herbs_delivered.push_back(tmp); cin >> tmp.second; herbs_expected.push_back(tmp); } std::sort(herbs_delivered.begin(), herbs_delivered.end(), less_than_key()); std::sort(herbs_expected.begin(), herbs_expected.end(), less_than_key()); int64_t leftmass = 0; int64_t leftheat = 0; int64_t lastmass = 0; int64_t lastheat = 0; int64_t soupmass = 0; int64_t soupheat = 0; bool possible = true; int left = 0; if(herbs_expected[0].second < herbs_delivered[0].second){ possible = false; } if(herbs_expected[herbs_expected.size() - 1].second > herbs_delivered[herbs_delivered.size() - 1].second){ possible = false; } for(int i = 0; i < herbs_expected.size() && possible; i++){ soupheat += herbs_expected[i].first * herbs_expected[i].second; soupmass += herbs_expected[i].first; while(left < herbs_expected.size() && (leftheat * soupmass) <= (soupheat * leftmass)) { lastmass = leftmass; lastheat = leftheat; leftmass += herbs_delivered[left].first; leftheat += herbs_delivered[left].first * herbs_delivered[left].second; left ++; } if(lastmass < soupmass && (lastheat * soupmass) < (soupheat * lastmass)){ int64_t leftt = soupmass - lastmass; if((lastheat + leftt * herbs_delivered[left - 1].second) > soupheat){ possible = false; break; } } if(leftmass < soupmass || (leftheat * soupmass) < (soupheat * leftmass)){ possible = false; break; } } if ((soupmass * leftheat) != (soupheat * leftmass) || leftmass != soupmass || left != herbs_expected.size()) { possible = false; } if(possible){ cout << "TAK" << endl; } else { cout << "NIE" << endl; } } } |