#include <bits/stdc++.h>
#define N 100007
using namespace std;
long long t, n,a,b,l;
pair<long long, long long> poczatkowe[N], koncowe[N];
pair<long long, long long> aktualny, pozadany;
pair<long long, long long> operator+(const pair<long long, long long> &a,
const pair<long long, long long> &b) {
long long nowa_objetosc = a.second + b.second;
long long nowa_temperatura = a.first + b.first;
return make_pair(nowa_temperatura, nowa_objetosc);
}
bool cmp(const pair<long long, long long> &a,
const pair<long long, long long> &b) {
if (b.second * a.first != a.second * b.first) {
return a.first * b.second < b.first * a.second;
}
return a < b;
}
long long laczna_energia;
int zuzyte;
bool skonczone;
bool przelej(int indeks, bool od_dolu) {
//if(zuzyte >= n) { printf("Cos poszlo nie tak1!\n"); return false; }
pozadany = pozadany + koncowe[indeks];
while (pozadany.second > aktualny.second + poczatkowe[zuzyte].second) {
aktualny = aktualny + poczatkowe[zuzyte];
zuzyte += 1;
}
//printf("Mam %lld objetosci i %lld temperatury\n", aktualny.second, aktualny.first);
//printf("Chce miec %lld objetosci i %lld temperatury\n", pozadany.second, pozadany.first);
//if(zuzyte >= n) { printf("Cos poszlo nie tak!\n"); return false; }
long long brakujaca_objetosc = pozadany.second - aktualny.second;
//printf("Moge dolac id %d: %lld %lld\n", zuzyte, brakujaca_objetosc, poczatkowe[zuzyte].first);
pair<long long, long long> po_dolaniu = aktualny + make_pair(poczatkowe[zuzyte].first, brakujaca_objetosc);
//printf("Po dolaniu bede mial %lld objetosci i %lld temperatury\n", po_dolaniu.second, po_dolaniu.first);
//printf("Chce miec %lld %lld\n", pozadany.second, pozadany.first);
if (od_dolu) {
if ((poczatkowe[zuzyte].first/poczatkowe[zuzyte].second) * brakujaca_objetosc > (pozadany.first - aktualny.first)) {
return false;
}
} else {
if ((poczatkowe[zuzyte].first/poczatkowe[zuzyte].second) * brakujaca_objetosc < (pozadany.first - aktualny.first)) {
return false;
}
}
return true;
}
int main() {
scanf("%lld", &t);
while(t--){
scanf("%lld", &n);
aktualny = make_pair(0, 0);
pozadany = make_pair(0, 0);
zuzyte = 0;
laczna_energia = 0LL;
for (int i = 0; i < n; i++) {
scanf("%lld%lld%lld", &l, &a, &b);
poczatkowe[i] = make_pair(a * l, l);
koncowe[i] = make_pair(b * l, l);
laczna_energia += l * (b - a);
}
if (laczna_energia != 0LL) {
printf("NIE\n");
continue;
}
sort(poczatkowe, poczatkowe+n, cmp);
sort(koncowe, koncowe+n, cmp);
//printf("poczatkowe: ");
for(int i=0; i <n ;i++){
//printf("%lld ", poczatkowe[i].first);
}
//printf("\n");
for(int i=0; i <n ;i++){
//printf("%lld ", poczatkowe[i].second);
}
//printf("\nkoncowe: ");
for(int i=0; i <n ;i++){
//printf("%lld ", koncowe[i].first);
}
//printf("\n");
skonczone = false;
for(int i = 0; i < n; i++) {
//printf("i%d, zuzyte %d\n", i, zuzyte);
if (!przelej(i, true)){
skonczone = true;
printf("NIE\n");
break;
}
}
if (skonczone) continue;
reverse(poczatkowe, poczatkowe+n);
reverse(koncowe, koncowe+n);
zuzyte = 0;
aktualny = make_pair(0, 0);
pozadany = make_pair(0, 0);
for(int i = 0; i < n; i++) {
//printf("i%d, zuzyte %d\n", i, zuzyte);
if (!przelej(i, false)){
skonczone = true;
printf("NIE\n");
break;
}
}
if (skonczone) continue;
printf("TAK\n");
}
}
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 109 110 111 112 | #include <bits/stdc++.h> #define N 100007 using namespace std; long long t, n,a,b,l; pair<long long, long long> poczatkowe[N], koncowe[N]; pair<long long, long long> aktualny, pozadany; pair<long long, long long> operator+(const pair<long long, long long> &a, const pair<long long, long long> &b) { long long nowa_objetosc = a.second + b.second; long long nowa_temperatura = a.first + b.first; return make_pair(nowa_temperatura, nowa_objetosc); } bool cmp(const pair<long long, long long> &a, const pair<long long, long long> &b) { if (b.second * a.first != a.second * b.first) { return a.first * b.second < b.first * a.second; } return a < b; } long long laczna_energia; int zuzyte; bool skonczone; bool przelej(int indeks, bool od_dolu) { //if(zuzyte >= n) { printf("Cos poszlo nie tak1!\n"); return false; } pozadany = pozadany + koncowe[indeks]; while (pozadany.second > aktualny.second + poczatkowe[zuzyte].second) { aktualny = aktualny + poczatkowe[zuzyte]; zuzyte += 1; } //printf("Mam %lld objetosci i %lld temperatury\n", aktualny.second, aktualny.first); //printf("Chce miec %lld objetosci i %lld temperatury\n", pozadany.second, pozadany.first); //if(zuzyte >= n) { printf("Cos poszlo nie tak!\n"); return false; } long long brakujaca_objetosc = pozadany.second - aktualny.second; //printf("Moge dolac id %d: %lld %lld\n", zuzyte, brakujaca_objetosc, poczatkowe[zuzyte].first); pair<long long, long long> po_dolaniu = aktualny + make_pair(poczatkowe[zuzyte].first, brakujaca_objetosc); //printf("Po dolaniu bede mial %lld objetosci i %lld temperatury\n", po_dolaniu.second, po_dolaniu.first); //printf("Chce miec %lld %lld\n", pozadany.second, pozadany.first); if (od_dolu) { if ((poczatkowe[zuzyte].first/poczatkowe[zuzyte].second) * brakujaca_objetosc > (pozadany.first - aktualny.first)) { return false; } } else { if ((poczatkowe[zuzyte].first/poczatkowe[zuzyte].second) * brakujaca_objetosc < (pozadany.first - aktualny.first)) { return false; } } return true; } int main() { scanf("%lld", &t); while(t--){ scanf("%lld", &n); aktualny = make_pair(0, 0); pozadany = make_pair(0, 0); zuzyte = 0; laczna_energia = 0LL; for (int i = 0; i < n; i++) { scanf("%lld%lld%lld", &l, &a, &b); poczatkowe[i] = make_pair(a * l, l); koncowe[i] = make_pair(b * l, l); laczna_energia += l * (b - a); } if (laczna_energia != 0LL) { printf("NIE\n"); continue; } sort(poczatkowe, poczatkowe+n, cmp); sort(koncowe, koncowe+n, cmp); //printf("poczatkowe: "); for(int i=0; i <n ;i++){ //printf("%lld ", poczatkowe[i].first); } //printf("\n"); for(int i=0; i <n ;i++){ //printf("%lld ", poczatkowe[i].second); } //printf("\nkoncowe: "); for(int i=0; i <n ;i++){ //printf("%lld ", koncowe[i].first); } //printf("\n"); skonczone = false; for(int i = 0; i < n; i++) { //printf("i%d, zuzyte %d\n", i, zuzyte); if (!przelej(i, true)){ skonczone = true; printf("NIE\n"); break; } } if (skonczone) continue; reverse(poczatkowe, poczatkowe+n); reverse(koncowe, koncowe+n); zuzyte = 0; aktualny = make_pair(0, 0); pozadany = make_pair(0, 0); for(int i = 0; i < n; i++) { //printf("i%d, zuzyte %d\n", i, zuzyte); if (!przelej(i, false)){ skonczone = true; printf("NIE\n"); break; } } if (skonczone) continue; printf("TAK\n"); } } |
English