#include <iostream>
#include <cstdint>
#include <vector>
#include <utility>
#include <algorithm>
#include <bitset>
#include <limits>
using namespace std;
typedef pair <int, int> kubek; // temperatura, objetosc
typedef pair<int64_t, int> en_vol; //energia objetosc
bool interp(en_vol f, en_vol g, en_vol x){
//Jeśli potrzebna energia jest wieksza niż interpolowana energia z krzywej kubków danych, nie da sie
return x.first * (g.second-f.second) > (f.first *( g.second - x.second )+ g.first *( x.second - f.second ) );
}
int main(){
std::ios::sync_with_stdio(false);
int t;
cin>>t;
vector<kubek> a,b;
for (int rep=0; rep<t;rep++){
a.clear();
b.clear();
int n;
cin>>n;
for (int i=0; i<n; i++){
int v, ta, tb;
cin>>v>>ta>>tb;
a.push_back(make_pair(ta,v));
b.push_back(make_pair(tb,v));
}
sort(begin(a),end(a),greater<kubek>());
sort(begin(b),end(b),greater<kubek>());
int64_t Ea =0, Eb=0;
int va=0,vb=0;
for (auto x:a){
va += x.second;
Ea += x.second*(int64_t)x.first;
}
for (auto x:b){
vb += x.second;
Eb += x.second*(int64_t)x.first;
}
if ( (va!=vb)||(Ea!=Eb) ){
cout<<"NIE\n";
// cerr<<"zasady podsawowe\n";
continue;
}
Ea =0; Eb=0; va=0;vb=0;
size_t it_a =0;
en_vol pA = make_pair(0,0);
en_vol pB = make_pair(0,0);
en_vol pA_prev = make_pair(0,0);
bool OK = true;
for (size_t i=0;i<b.size(); i++){
pB.first += b[i].first *(int64_t) b[i].second;
pB.second += b[i].second;
while( pA.second < pB.second ){
pA_prev = pA;
pA.first += a[it_a].first *(int64_t) a[it_a].second;
pA.second += a[it_a].second;
it_a++;
}
if ( interp(pA_prev, pA,pB) ){
OK=false;
break;
}
}
cout<<(OK?"TAK":"NIE")<<endl;
}
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 | #include <iostream> #include <cstdint> #include <vector> #include <utility> #include <algorithm> #include <bitset> #include <limits> using namespace std; typedef pair <int, int> kubek; // temperatura, objetosc typedef pair<int64_t, int> en_vol; //energia objetosc bool interp(en_vol f, en_vol g, en_vol x){ //Jeśli potrzebna energia jest wieksza niż interpolowana energia z krzywej kubków danych, nie da sie return x.first * (g.second-f.second) > (f.first *( g.second - x.second )+ g.first *( x.second - f.second ) ); } int main(){ std::ios::sync_with_stdio(false); int t; cin>>t; vector<kubek> a,b; for (int rep=0; rep<t;rep++){ a.clear(); b.clear(); int n; cin>>n; for (int i=0; i<n; i++){ int v, ta, tb; cin>>v>>ta>>tb; a.push_back(make_pair(ta,v)); b.push_back(make_pair(tb,v)); } sort(begin(a),end(a),greater<kubek>()); sort(begin(b),end(b),greater<kubek>()); int64_t Ea =0, Eb=0; int va=0,vb=0; for (auto x:a){ va += x.second; Ea += x.second*(int64_t)x.first; } for (auto x:b){ vb += x.second; Eb += x.second*(int64_t)x.first; } if ( (va!=vb)||(Ea!=Eb) ){ cout<<"NIE\n"; // cerr<<"zasady podsawowe\n"; continue; } Ea =0; Eb=0; va=0;vb=0; size_t it_a =0; en_vol pA = make_pair(0,0); en_vol pB = make_pair(0,0); en_vol pA_prev = make_pair(0,0); bool OK = true; for (size_t i=0;i<b.size(); i++){ pB.first += b[i].first *(int64_t) b[i].second; pB.second += b[i].second; while( pA.second < pB.second ){ pA_prev = pA; pA.first += a[it_a].first *(int64_t) a[it_a].second; pA.second += a[it_a].second; it_a++; } if ( interp(pA_prev, pA,pB) ){ OK=false; break; } } cout<<(OK?"TAK":"NIE")<<endl; } return 0; } |
English