#include<stdio.h> #include<vector> #include<algorithm> #define st first #define nd second using namespace std; const int p1=65536,p2=131072; int drz[p2]; int akt(int x,int w){ x+=p1-1; drz[x]=w; while(x>0){ x=(x-1)/2; drz[x]=max(drz[2*x+1],drz[2*x+2]); } } int maks(int a,int b){ a+=p1-1; b+=p1-1; if(b<a)return 0; int wyn=max(drz[a],drz[b]); while((a-1)/2!=(b-1)/2){ if(a%2==1)wyn=max(wyn,drz[a+1]); if(b%2==0)wyn=max(wyn,drz[b-1]); a=(a-1)/2; b=(b-1)/2; } return wyn; } int f(){ vector<pair<int,pair<int,int> > >v; vector<pair<int,int> >w; int n,szer; scanf("%d%d",&n,&szer); int pozycja[n]; for(int i=0;i<n;i++){ int x1,x2,y1,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(x1>x2)swap(x1,x2); if(y1>y2)swap(y1,y2); v.push_back(make_pair(x1,make_pair(i,y2-y1))); } for(int i=0;i<n;i++){ int x1,x2,y1,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(x1>x2)swap(x1,x2); if(y1>y2)swap(y1,y2); w.push_back(make_pair(x1,i)); } sort(v.begin(),v.end()); sort(w.begin(),w.end()); for(int i=0;i<n;i++)pozycja[v[i].nd.st]=i; //for(int i=0;i<n;i++)cout<<w[i].nd<<" "; //cout<<"\n"; //for(int i=0;i<n;i++)cout<<v[i].nd.st<<" "; //cout<<"\n"; for(int i=0;i<p2;i++)drz[i]=0; for(int i=0;i<n;i++)akt(i,v[i].nd.nd); //cout<<"drzewo:\n"; //for(int i=0;i<n;i++)cout<<maks(i,i)<<" "; //cout<<"\n"; for(int i=0;i<n;i++){ //cout<<"przestawiam "<<w[i].nd<<" "<<pozycja[w[i].nd]<<" maks= "<<maks(0,pozycja[w[i].nd]-1)<<"\n"; if(maks(0,pozycja[w[i].nd]-1)+v[pozycja[w[i].nd]].nd.nd>szer){printf("NIE\n");return 0;} akt(pozycja[w[i].nd],0); } printf("TAK\n"); } main(){ int t; scanf("%d",&t); while(t--)f(); }
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 | #include<stdio.h> #include<vector> #include<algorithm> #define st first #define nd second using namespace std; const int p1=65536,p2=131072; int drz[p2]; int akt(int x,int w){ x+=p1-1; drz[x]=w; while(x>0){ x=(x-1)/2; drz[x]=max(drz[2*x+1],drz[2*x+2]); } } int maks(int a,int b){ a+=p1-1; b+=p1-1; if(b<a)return 0; int wyn=max(drz[a],drz[b]); while((a-1)/2!=(b-1)/2){ if(a%2==1)wyn=max(wyn,drz[a+1]); if(b%2==0)wyn=max(wyn,drz[b-1]); a=(a-1)/2; b=(b-1)/2; } return wyn; } int f(){ vector<pair<int,pair<int,int> > >v; vector<pair<int,int> >w; int n,szer; scanf("%d%d",&n,&szer); int pozycja[n]; for(int i=0;i<n;i++){ int x1,x2,y1,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(x1>x2)swap(x1,x2); if(y1>y2)swap(y1,y2); v.push_back(make_pair(x1,make_pair(i,y2-y1))); } for(int i=0;i<n;i++){ int x1,x2,y1,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(x1>x2)swap(x1,x2); if(y1>y2)swap(y1,y2); w.push_back(make_pair(x1,i)); } sort(v.begin(),v.end()); sort(w.begin(),w.end()); for(int i=0;i<n;i++)pozycja[v[i].nd.st]=i; //for(int i=0;i<n;i++)cout<<w[i].nd<<" "; //cout<<"\n"; //for(int i=0;i<n;i++)cout<<v[i].nd.st<<" "; //cout<<"\n"; for(int i=0;i<p2;i++)drz[i]=0; for(int i=0;i<n;i++)akt(i,v[i].nd.nd); //cout<<"drzewo:\n"; //for(int i=0;i<n;i++)cout<<maks(i,i)<<" "; //cout<<"\n"; for(int i=0;i<n;i++){ //cout<<"przestawiam "<<w[i].nd<<" "<<pozycja[w[i].nd]<<" maks= "<<maks(0,pozycja[w[i].nd]-1)<<"\n"; if(maks(0,pozycja[w[i].nd]-1)+v[pozycja[w[i].nd]].nd.nd>szer){printf("NIE\n");return 0;} akt(pozycja[w[i].nd],0); } printf("TAK\n"); } main(){ int t; scanf("%d",&t); while(t--)f(); } |