#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int t; int n, w, m; int wys1, wys2; int kol1[50007]; int kol2[50007]; int dlu1, dlu2; int odl[50007]; int gru[50007]; int drzewo[140000]; int wyn; bool jes; int vi; bool mniej(int a, int b) { if (odl[a]==odl[b]) return a<b; return odl[a]<odl[b]; } int pot(int v) { for (int i=1; i; i*=2) if (i>=v) return i; } int szum(int v, int a, int b, int graa, int grab) { if (b<graa || a>grab) return 0; if (a>=graa && b<=grab) return drzewo[v]; return max(szum(v*2, a, (a+b)/2, graa, grab), szum(v*2+1, (a+b)/2+1, b, graa, grab)); } int main() { scanf("%d", &t); for (int h=1; h<=t; h++) { jes=true; for (int i=0; i<=m*2; i++) drzewo[i]=0; scanf("%d%d", &n, &w); m=pot(n); for (int i=1; i<=n; i++) { scanf("%d%d%d%d", &dlu1, &wys1, &dlu2, &wys2); gru[i]=wys2-wys1; odl[i]=dlu1; kol1[i]=i; } sort(kol1+1, kol1+1+n, mniej); for (int i=1; i<=n; i++) { scanf("%d%d%d%d", &dlu1, &wys1, &dlu2, &wys2); odl[i]=dlu1; kol2[i]=i; } sort(kol2+1, kol2+1+n, mniej); for (int i=1; i<=n; i++) { odl[kol1[i]]=i; } for (int i=1; i<=n; i++) { drzewo[i+m-1]=gru[kol1[i]]; } for (int i=1; i<=n; i++) for (int i=m-1; i>0; i--) drzewo[i]=max(drzewo[i*2], drzewo[i*2+1]); for (int i=1; i<=n; i++) { wyn=szum(1, 1, m, 1, odl[kol2[i]]-1); if (odl[kol2[i]]==1 || w-wyn>=gru[kol2[i]]) { vi=m-1+odl[kol2[i]]; drzewo[vi]=0; while(vi>1) { vi/=2; drzewo[vi]=max(drzewo[vi*2], drzewo[vi*2+1]); } } else { jes=false; break; } } if (jes) printf("TAK\n"); else printf("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 | #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int t; int n, w, m; int wys1, wys2; int kol1[50007]; int kol2[50007]; int dlu1, dlu2; int odl[50007]; int gru[50007]; int drzewo[140000]; int wyn; bool jes; int vi; bool mniej(int a, int b) { if (odl[a]==odl[b]) return a<b; return odl[a]<odl[b]; } int pot(int v) { for (int i=1; i; i*=2) if (i>=v) return i; } int szum(int v, int a, int b, int graa, int grab) { if (b<graa || a>grab) return 0; if (a>=graa && b<=grab) return drzewo[v]; return max(szum(v*2, a, (a+b)/2, graa, grab), szum(v*2+1, (a+b)/2+1, b, graa, grab)); } int main() { scanf("%d", &t); for (int h=1; h<=t; h++) { jes=true; for (int i=0; i<=m*2; i++) drzewo[i]=0; scanf("%d%d", &n, &w); m=pot(n); for (int i=1; i<=n; i++) { scanf("%d%d%d%d", &dlu1, &wys1, &dlu2, &wys2); gru[i]=wys2-wys1; odl[i]=dlu1; kol1[i]=i; } sort(kol1+1, kol1+1+n, mniej); for (int i=1; i<=n; i++) { scanf("%d%d%d%d", &dlu1, &wys1, &dlu2, &wys2); odl[i]=dlu1; kol2[i]=i; } sort(kol2+1, kol2+1+n, mniej); for (int i=1; i<=n; i++) { odl[kol1[i]]=i; } for (int i=1; i<=n; i++) { drzewo[i+m-1]=gru[kol1[i]]; } for (int i=1; i<=n; i++) for (int i=m-1; i>0; i--) drzewo[i]=max(drzewo[i*2], drzewo[i*2+1]); for (int i=1; i<=n; i++) { wyn=szum(1, 1, m, 1, odl[kol2[i]]-1); if (odl[kol2[i]]==1 || w-wyn>=gru[kol2[i]]) { vi=m-1+odl[kol2[i]]; drzewo[vi]=0; while(vi>1) { vi/=2; drzewo[vi]=max(drzewo[vi*2], drzewo[vi*2+1]); } } else { jes=false; break; } } if (jes) printf("TAK\n"); else printf("NIE\n"); } return 0; } |