#include<iostream>
#include<vector>
#include<algorithm>
#define VECUINT std::vector<unsigned int>
#define PUII std::pair<unsigned int, unsigned int>
#define VECPUII std::vector<PUII >
struct Potegowe{
VECUINT tab;
Potegowe(unsigned int n): tab(n+1,0) {}
void insert(unsigned int x, unsigned int v){
for(;x<tab.size()&&tab[x]<v;x+=(x&(-x)))
tab[x]=v;
}
unsigned int query(unsigned int x){
unsigned int r=0;
for(;x>0;x-=(x&(-x)))
r=std::max(r,tab[x]);
return r;
}
};
int main(){
std::ios_base::sync_with_stdio(false);
unsigned int t;
std::cin>>t;
while(t--){
unsigned int n,w;
std::cin>>n>>w;
VECPUII A(n),B(n);
VECUINT Wysokosc(n),Polozenie(n);
unsigned int x1,x2,y1,y2;
for(unsigned int i=0;i<n;++i){
std::cin>>x1>>y1>>x2>>y2;
Wysokosc[i]=abs(y2-y1);
A[i]=PUII(std::min(x1,x2),i);
}
std::sort(A.begin(),A.end());
for(unsigned int i=0;i<A.size();++i)
Polozenie[A[i].second]=i;
for(unsigned int i=0;i<n;++i){
std::cin>>x1>>y1>>x2>>y2;
B[i]=PUII(std::min(x1,x2),i);
}
std::sort(B.begin(),B.end());
Potegowe S(n);
bool sol=true;
for(unsigned int i=0;i<B.size()&/++i){
if(Wysokosc[B[i].second]+S.query(n-Polozenie[B[i].second])>w)
sol=false;
S.insert(n-Polozenie[B[i].second],Wysokosc[B[i].second]);
}
std::cout<<(sol?"TAK":"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 | #include<iostream> #include<vector> #include<algorithm> #define VECUINT std::vector<unsigned int> #define PUII std::pair<unsigned int, unsigned int> #define VECPUII std::vector<PUII > struct Potegowe{ VECUINT tab; Potegowe(unsigned int n): tab(n+1,0) {} void insert(unsigned int x, unsigned int v){ for(;x<tab.size()&&tab[x]<v;x+=(x&(-x))) tab[x]=v; } unsigned int query(unsigned int x){ unsigned int r=0; for(;x>0;x-=(x&(-x))) r=std::max(r,tab[x]); return r; } }; int main(){ std::ios_base::sync_with_stdio(false); unsigned int t; std::cin>>t; while(t--){ unsigned int n,w; std::cin>>n>>w; VECPUII A(n),B(n); VECUINT Wysokosc(n),Polozenie(n); unsigned int x1,x2,y1,y2; for(unsigned int i=0;i<n;++i){ std::cin>>x1>>y1>>x2>>y2; Wysokosc[i]=abs(y2-y1); A[i]=PUII(std::min(x1,x2),i); } std::sort(A.begin(),A.end()); for(unsigned int i=0;i<A.size();++i) Polozenie[A[i].second]=i; for(unsigned int i=0;i<n;++i){ std::cin>>x1>>y1>>x2>>y2; B[i]=PUII(std::min(x1,x2),i); } std::sort(B.begin(),B.end()); Potegowe S(n); bool sol=true; for(unsigned int i=0;i<B.size()&/++i){ if(Wysokosc[B[i].second]+S.query(n-Polozenie[B[i].second])>w) sol=false; S.insert(n-Polozenie[B[i].second],Wysokosc[B[i].second]); } std::cout<<(sol?"TAK":"NIE")<<"\n"; } return 0; } |
English