#include <iostream>
#include <cstdio>
#include <ctime>
#include <vector>
#include <algorithm>
#define LL long long
#define ff first
#define ss second
#define PB push_back
#define MP make_pair
#define DEBUG(x) cerr<<#x<<" "<<(x)<<endl;
using namespace std;
const int N = 50005;
int xp[N], xk[N], xp2[N], xk2[N], H[N], gdzie[N], poczatek[N], koniec[N], y, y2;
int n, t, X;
int czapa, drz[10*N];
bool cmp(int a, int b)
{
return xk[a] < xk[b];
}
bool cmk(int a, int b)
{
return xp2[a] < xp2[b];
}
void wrzuc(int poz, int w)
{
poz += czapa;
while(poz >= 1)
{
drz[poz] = max(drz[poz], w);
poz >>= 1;
}
}
int szukaj(int poza, int pozb)
{
poza += czapa;
pozb += czapa;
int ret = max(drz[poza], drz[pozb]);
while(poza/2 != pozb/2)
{
if(poza%2 == 0)ret = max(ret, drz[poza+1]);
if(pozb%2 == 1)ret = max(ret, drz[pozb-1]);
poza >>= 1;
pozb >>= 1;
}
return ret;
}
void wyrzuc(int poz)
{
poz += czapa;
drz[poz] = 0;
poz >>= 1;
while(poz >= 1)
{
drz[poz] = max(drz[poz*2], drz[poz*2+1]);
poz >>= 1;
}
}
bool rozwiaz()
{
czapa = 1;
while(czapa <= n)czapa *= 2;
for(int i=1; i<=n; i++)
{
gdzie[poczatek[i]] = i;
wrzuc(i, H[poczatek[i]]);
}
for(int i=1; i<=n; i++)
{
int w = koniec[i];
wyrzuc(gdzie[w]);
if(szukaj(1, gdzie[w]) + H[w] > X)
{
for(int i=1; i<2*czapa; i++)drz[i] = 0;
return 0;
}
}
for(int i=1; i<2*czapa; i++)drz[i] = 0;
return 1;
}
int main()
{
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &X);
for(int i=1; i<=n; i++)
{
scanf("%d%d%d%d", &xp[i], &y, &xk[i], &y2);
H[i] = abs(y - y2);
if(xp[i] > xk[i])swap(xp[i], xk[i]);
}
for(int i=1; i<=n; i++)
{
scanf("%d%d%d%d", &xp2[i], &y, &xk2[i], &y2);
if(xp2[i] > xk2[i])swap(xp2[i], xk2[i]);
}
for(int i=1; i<=n; i++)
poczatek[i] = koniec[i] = i;
sort(poczatek+1, poczatek+1+n, cmp);
sort(koniec+1, koniec+1+n, cmk);
printf(rozwiaz()? "TAK\n": "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 103 104 105 106 | #include <iostream> #include <cstdio> #include <ctime> #include <vector> #include <algorithm> #define LL long long #define ff first #define ss second #define PB push_back #define MP make_pair #define DEBUG(x) cerr<<#x<<" "<<(x)<<endl; using namespace std; const int N = 50005; int xp[N], xk[N], xp2[N], xk2[N], H[N], gdzie[N], poczatek[N], koniec[N], y, y2; int n, t, X; int czapa, drz[10*N]; bool cmp(int a, int b) { return xk[a] < xk[b]; } bool cmk(int a, int b) { return xp2[a] < xp2[b]; } void wrzuc(int poz, int w) { poz += czapa; while(poz >= 1) { drz[poz] = max(drz[poz], w); poz >>= 1; } } int szukaj(int poza, int pozb) { poza += czapa; pozb += czapa; int ret = max(drz[poza], drz[pozb]); while(poza/2 != pozb/2) { if(poza%2 == 0)ret = max(ret, drz[poza+1]); if(pozb%2 == 1)ret = max(ret, drz[pozb-1]); poza >>= 1; pozb >>= 1; } return ret; } void wyrzuc(int poz) { poz += czapa; drz[poz] = 0; poz >>= 1; while(poz >= 1) { drz[poz] = max(drz[poz*2], drz[poz*2+1]); poz >>= 1; } } bool rozwiaz() { czapa = 1; while(czapa <= n)czapa *= 2; for(int i=1; i<=n; i++) { gdzie[poczatek[i]] = i; wrzuc(i, H[poczatek[i]]); } for(int i=1; i<=n; i++) { int w = koniec[i]; wyrzuc(gdzie[w]); if(szukaj(1, gdzie[w]) + H[w] > X) { for(int i=1; i<2*czapa; i++)drz[i] = 0; return 0; } } for(int i=1; i<2*czapa; i++)drz[i] = 0; return 1; } int main() { scanf("%d", &t); while(t--) { scanf("%d%d", &n, &X); for(int i=1; i<=n; i++) { scanf("%d%d%d%d", &xp[i], &y, &xk[i], &y2); H[i] = abs(y - y2); if(xp[i] > xk[i])swap(xp[i], xk[i]); } for(int i=1; i<=n; i++) { scanf("%d%d%d%d", &xp2[i], &y, &xk2[i], &y2); if(xp2[i] > xk2[i])swap(xp2[i], xk2[i]); } for(int i=1; i<=n; i++) poczatek[i] = koniec[i] = i; sort(poczatek+1, poczatek+1+n, cmp); sort(koniec+1, koniec+1+n, cmk); printf(rozwiaz()? "TAK\n": "NIE\n"); } return 0; } |
English