#include <cstdio> #include <algorithm> using namespace std; int t,n; int l, a, b; struct para { int temp; int amount; }; bool comp(para p1, para p2) { return p1.temp > p2.temp; } para bef[100001]; para aft[100001]; int main() { scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i=0; i<n;i++) { scanf("%d %d %d", &l, &a, &b); bef[i].amount = l; bef[i].temp = a; aft[i].amount = l; aft[i].temp = b; } sort(bef, bef+n, comp); sort(aft, aft+n, comp); // for(int i=0; i<n;i++) { // printf("%d %d\n", bef[i].temp, aft[i].temp); // } int i=0,j=0; long long int r=0; bool answer = true; while(i<n && j < n) { int temp1 = bef[i].temp; int temp2 = aft[j].temp; int amt1 = bef[i].amount; int amt2 = aft[j].amount; if (temp1 >= temp2) { // printf("A1 "); int temp_dif = temp1 - temp2; if (amt1 == amt2) { // po rowno r+= amt1 * temp_dif; i++; j++; } else if (amt1 >= amt2) { // cieplejszego wiecej bef[i].amount -= amt2; r += temp_dif * amt2; j++; } else { // cieplejszego mniej aft[j].amount -= amt1; r += temp_dif * amt1; i++; } } else { // printf("A2 "); // dogrzewamy int temp_dif = temp2 - temp1; if (amt1 >= amt2) { int amt_dif = amt1 - amt2; long long int imd = temp_dif * amt2; if (imd <= r) { // dokładam r -= imd; bef[i].amount -= amt2; j++; } else { answer = false; break; } } else { int amt_dif = amt2 - amt1; long long int imd = temp_dif * amt1; if (imd <= r) { // dokładam r -= imd; aft[j].amount -= amt1; i++; } else { answer = false; break; } } } } if (answer && r == 0) printf("TAK\n"); else printf("NIE\n"); } 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 | #include <cstdio> #include <algorithm> using namespace std; int t,n; int l, a, b; struct para { int temp; int amount; }; bool comp(para p1, para p2) { return p1.temp > p2.temp; } para bef[100001]; para aft[100001]; int main() { scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i=0; i<n;i++) { scanf("%d %d %d", &l, &a, &b); bef[i].amount = l; bef[i].temp = a; aft[i].amount = l; aft[i].temp = b; } sort(bef, bef+n, comp); sort(aft, aft+n, comp); // for(int i=0; i<n;i++) { // printf("%d %d\n", bef[i].temp, aft[i].temp); // } int i=0,j=0; long long int r=0; bool answer = true; while(i<n && j < n) { int temp1 = bef[i].temp; int temp2 = aft[j].temp; int amt1 = bef[i].amount; int amt2 = aft[j].amount; if (temp1 >= temp2) { // printf("A1 "); int temp_dif = temp1 - temp2; if (amt1 == amt2) { // po rowno r+= amt1 * temp_dif; i++; j++; } else if (amt1 >= amt2) { // cieplejszego wiecej bef[i].amount -= amt2; r += temp_dif * amt2; j++; } else { // cieplejszego mniej aft[j].amount -= amt1; r += temp_dif * amt1; i++; } } else { // printf("A2 "); // dogrzewamy int temp_dif = temp2 - temp1; if (amt1 >= amt2) { int amt_dif = amt1 - amt2; long long int imd = temp_dif * amt2; if (imd <= r) { // dokładam r -= imd; bef[i].amount -= amt2; j++; } else { answer = false; break; } } else { int amt_dif = amt2 - amt1; long long int imd = temp_dif * amt1; if (imd <= r) { // dokładam r -= imd; aft[j].amount -= amt1; i++; } else { answer = false; break; } } } } if (answer && r == 0) printf("TAK\n"); else printf("NIE\n"); } return 0; } |