#include <algorithm> #include <iostream> #include <cstdio> #include <utility> #include <set> #include <map> #include <queue> using namespace std; #define FOR(x,b,e) for(int x=b; x<=(e); ++x) #define REP(x,n) for(int x=0; x<(n); ++x) #define FORD(x,b,e) for(int x=b; x>=(e); --x) typedef pair<int,int> PII; #define MP make_pair #define MAXN 50005 #define ST first #define ND second int t,n,w; int H[MAXN]; int X[MAXN]; int E[MAXN]; PII ORD[MAXN]; PII ORD_H[MAXN]; int M[MAXN]; bool isFirstOnLeft(int st, int nd){ return E[st]<=E[nd]; } bool merge(int begin, int end){ if(begin>=end) return true; int mid = (begin+end)/2; if(!merge(begin,mid)||!merge(mid+1,end)) return false; /* printf("merge %d %d\n",begin,end); FOR(x,begin,end)printf("%d ", ORD[x].ND); printf("\n"); */ FOR(x,begin,end){ORD_H[x].ST=ORD[x].ST; ORD_H[x].ND=ORD[x].ND;} FORD(x,mid,begin)M[x]=0; M[mid]=H[ORD_H[mid].ND]; FORD(x,mid-1,begin)M[x]=max(M[x+1],H[ORD_H[x].ND]); FORD(x,end,mid+1)M[x]=0; M[end]=H[ORD_H[end].ND]; FORD(x,end,mid+1)M[x]=max(M[x+1],H[ORD_H[x].ND]); /* FOR(x,begin,end)printf("%d ", M[x]); printf("\n"); FOR(x,begin,end)printf("%d ", H[ORD_H[x].ND]); printf("\n"); FOR(x,begin,end)printf("%d ", E[ORD_H[x].ND]); printf("\n"); */ int st=begin,nd=mid+1; int org=begin; while(st<=mid&&nd<=end){ //printf("st %d nd %d e1 %d e2 %d \n",ORD_H[st].ND,ORD_H[nd].ND,E[ORD_H[st].ND],E[ORD_H[nd].ND]); if(E[ORD_H[st].ND]<=E[ORD_H[nd].ND]){ ORD[org].ST=ORD_H[st].ST; ORD[org].ND=ORD_H[st].ND; st++; } else { //printf("War st %d nd %d max %d h %d\n",ORD_H[st].ND,ORD_H[nd].ND,M[st],H[ORD_H[nd].ND]); if(M[st]+H[ORD_H[nd].ND]<=w){ ORD[org].ST=ORD_H[nd].ST; ORD[org].ND=ORD_H[nd].ND; } else return false; nd++; } org++; } while(st<=mid){ ORD[org].ST=ORD_H[st].ST; ORD[org].ND=ORD_H[st].ND; st++; org++; } while(nd<=end){ ORD[org].ST=ORD_H[nd].ST; ORD[org].ND=ORD_H[nd].ND; nd++; org++; } return true; } void solve(){ /*REP(x,n)printf("(%d,%d) ",X[x],H[x]); printf("\n"); REP(x,n)printf("(%d,%d) ",ORD[x].ST, ORD[x].ND); printf("\n"); REP(x,n)printf("%d ",E[x]); printf("\n"); */ if(!merge(0,n-1)) printf("NIE\n"); else printf("TAK\n"); } int main() { scanf("%d",&t); int x1,y1,x2,y2; REP(x,t){ scanf("%d%d",&n,&w); REP(y,n){ scanf("%d%d%d%d",&x1,&y1,&x2,&y2); H[y]=abs(y2-y1); X[y]=min(x1,x2); ORD[y].ST=min(x1,x2); ORD[y].ND=y; } sort(ORD,ORD+n); REP(y,n){ scanf("%d%d%d%d",&x1,&y1,&x2,&y2); E[y]=min(x1,x2); } solve(); } 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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | #include <algorithm> #include <iostream> #include <cstdio> #include <utility> #include <set> #include <map> #include <queue> using namespace std; #define FOR(x,b,e) for(int x=b; x<=(e); ++x) #define REP(x,n) for(int x=0; x<(n); ++x) #define FORD(x,b,e) for(int x=b; x>=(e); --x) typedef pair<int,int> PII; #define MP make_pair #define MAXN 50005 #define ST first #define ND second int t,n,w; int H[MAXN]; int X[MAXN]; int E[MAXN]; PII ORD[MAXN]; PII ORD_H[MAXN]; int M[MAXN]; bool isFirstOnLeft(int st, int nd){ return E[st]<=E[nd]; } bool merge(int begin, int end){ if(begin>=end) return true; int mid = (begin+end)/2; if(!merge(begin,mid)||!merge(mid+1,end)) return false; /* printf("merge %d %d\n",begin,end); FOR(x,begin,end)printf("%d ", ORD[x].ND); printf("\n"); */ FOR(x,begin,end){ORD_H[x].ST=ORD[x].ST; ORD_H[x].ND=ORD[x].ND;} FORD(x,mid,begin)M[x]=0; M[mid]=H[ORD_H[mid].ND]; FORD(x,mid-1,begin)M[x]=max(M[x+1],H[ORD_H[x].ND]); FORD(x,end,mid+1)M[x]=0; M[end]=H[ORD_H[end].ND]; FORD(x,end,mid+1)M[x]=max(M[x+1],H[ORD_H[x].ND]); /* FOR(x,begin,end)printf("%d ", M[x]); printf("\n"); FOR(x,begin,end)printf("%d ", H[ORD_H[x].ND]); printf("\n"); FOR(x,begin,end)printf("%d ", E[ORD_H[x].ND]); printf("\n"); */ int st=begin,nd=mid+1; int org=begin; while(st<=mid&&nd<=end){ //printf("st %d nd %d e1 %d e2 %d \n",ORD_H[st].ND,ORD_H[nd].ND,E[ORD_H[st].ND],E[ORD_H[nd].ND]); if(E[ORD_H[st].ND]<=E[ORD_H[nd].ND]){ ORD[org].ST=ORD_H[st].ST; ORD[org].ND=ORD_H[st].ND; st++; } else { //printf("War st %d nd %d max %d h %d\n",ORD_H[st].ND,ORD_H[nd].ND,M[st],H[ORD_H[nd].ND]); if(M[st]+H[ORD_H[nd].ND]<=w){ ORD[org].ST=ORD_H[nd].ST; ORD[org].ND=ORD_H[nd].ND; } else return false; nd++; } org++; } while(st<=mid){ ORD[org].ST=ORD_H[st].ST; ORD[org].ND=ORD_H[st].ND; st++; org++; } while(nd<=end){ ORD[org].ST=ORD_H[nd].ST; ORD[org].ND=ORD_H[nd].ND; nd++; org++; } return true; } void solve(){ /*REP(x,n)printf("(%d,%d) ",X[x],H[x]); printf("\n"); REP(x,n)printf("(%d,%d) ",ORD[x].ST, ORD[x].ND); printf("\n"); REP(x,n)printf("%d ",E[x]); printf("\n"); */ if(!merge(0,n-1)) printf("NIE\n"); else printf("TAK\n"); } int main() { scanf("%d",&t); int x1,y1,x2,y2; REP(x,t){ scanf("%d%d",&n,&w); REP(y,n){ scanf("%d%d%d%d",&x1,&y1,&x2,&y2); H[y]=abs(y2-y1); X[y]=min(x1,x2); ORD[y].ST=min(x1,x2); ORD[y].ND=y; } sort(ORD,ORD+n); REP(y,n){ scanf("%d%d%d%d",&x1,&y1,&x2,&y2); E[y]=min(x1,x2); } solve(); } return 0; } |