#include <stdio.h> #include <stdlib.h> #define xint64 long long #define MAXN 102400 int n; int l[MAXN]; int a[MAXN]; int b[MAXN]; int ix[MAXN]; typedef struct { int t; xint64 v; } t_pair; int ip = 0; t_pair pairs[2*MAXN]; int cmp(const void* a1, const void* a2) { int i1 = *((const int*) a1); int i2 = *((const int*) a2); if (pairs[i1].t!=pairs[i2].t) return pairs[i1].t-pairs[i2].t; return pairs[i1].v-pairs[i2].v; } void norm(int l, int r) { xint64 s = 0; for (int i=l;i<=r;i++) { s += pairs[ix[i]].v; pairs[ix[i]].v = 0; } pairs[ix[r]].v = s; } void show() { for (int i=0;i<ip;i++) printf("%d %d\n", pairs[ix[i]].t, pairs[ix[i]].v); printf("\n"); } xint64 balance() { xint64 s = 0; for (int i=0;i<ip;i++) s += ((xint64)pairs[ix[i]].t) * pairs[ix[i]].v; return s; } int showE() { xint64 eu = 0; int lu = 0; xint64 ed = 0; int ld = 0; for (int i=0;i<ip;i++) { if (lu>=ld && ed+(lu-ld)*(((xint64)pairs[ix[i]].t))>eu) return 0; if (pairs[ix[i]].v<0) { ed -= ((xint64)pairs[ix[i]].t) * pairs[ix[i]].v; ld -= pairs[ix[i]].v; } else { eu += ((xint64)pairs[ix[i]].t) * pairs[ix[i]].v; lu += pairs[ix[i]].v; } if (lu>=ld && ed+(lu-ld)*(1+((xint64)pairs[ix[i]].t))>eu) return 0; //printf("%d %d l:%d, e:%lld vs l:%d, e:%lld\n", pairs[ix[i]].t, pairs[ix[i]].v, lu, eu, ld, ed); } //printf("\n"); return 1; } void empty() { int j = 0; for (int i=0;i<ip;i++) { if (pairs[ix[i]].v!=0) { pairs[ix[j]].v = pairs[ix[i]].v; pairs[ix[j]].t = pairs[ix[i]].t; j++; } } ip = j; } int main() { int k; scanf("%d", &k); for (int i=0;i<k;i++) { scanf("%d", &n); for (int i=0;i<n;i++) scanf("%d%d%d", &l[i], &a[i], &b[i]); ip = 0; for (int i=0;i<n;i++) { ix[ip] = ip; pairs[ip].t = a[i]; pairs[ip].v = -l[i]; ip++; ix[ip] = ip; pairs[ip].t = b[i]; pairs[ip].v = l[i]; ip++; } qsort(ix, ip, sizeof(int), cmp); //show(); int lix = 0; for (int i=0;i<ip;i++) { if (pairs[ix[i]].t!=pairs[ix[lix]].t) { norm(lix, i-1); lix = i; } } norm(lix, ip-1); //show(); empty(); if (ip==0) { printf("TAK\n"); continue ; } if (0!=balance() || pairs[ix[0]].v>0 || pairs[ix[ip-1]].v>0) { printf("NIE\n"); continue ; } if (showE()) printf("TAK\n"); else printf("NIE\n"); } }
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 127 128 129 | #include <stdio.h> #include <stdlib.h> #define xint64 long long #define MAXN 102400 int n; int l[MAXN]; int a[MAXN]; int b[MAXN]; int ix[MAXN]; typedef struct { int t; xint64 v; } t_pair; int ip = 0; t_pair pairs[2*MAXN]; int cmp(const void* a1, const void* a2) { int i1 = *((const int*) a1); int i2 = *((const int*) a2); if (pairs[i1].t!=pairs[i2].t) return pairs[i1].t-pairs[i2].t; return pairs[i1].v-pairs[i2].v; } void norm(int l, int r) { xint64 s = 0; for (int i=l;i<=r;i++) { s += pairs[ix[i]].v; pairs[ix[i]].v = 0; } pairs[ix[r]].v = s; } void show() { for (int i=0;i<ip;i++) printf("%d %d\n", pairs[ix[i]].t, pairs[ix[i]].v); printf("\n"); } xint64 balance() { xint64 s = 0; for (int i=0;i<ip;i++) s += ((xint64)pairs[ix[i]].t) * pairs[ix[i]].v; return s; } int showE() { xint64 eu = 0; int lu = 0; xint64 ed = 0; int ld = 0; for (int i=0;i<ip;i++) { if (lu>=ld && ed+(lu-ld)*(((xint64)pairs[ix[i]].t))>eu) return 0; if (pairs[ix[i]].v<0) { ed -= ((xint64)pairs[ix[i]].t) * pairs[ix[i]].v; ld -= pairs[ix[i]].v; } else { eu += ((xint64)pairs[ix[i]].t) * pairs[ix[i]].v; lu += pairs[ix[i]].v; } if (lu>=ld && ed+(lu-ld)*(1+((xint64)pairs[ix[i]].t))>eu) return 0; //printf("%d %d l:%d, e:%lld vs l:%d, e:%lld\n", pairs[ix[i]].t, pairs[ix[i]].v, lu, eu, ld, ed); } //printf("\n"); return 1; } void empty() { int j = 0; for (int i=0;i<ip;i++) { if (pairs[ix[i]].v!=0) { pairs[ix[j]].v = pairs[ix[i]].v; pairs[ix[j]].t = pairs[ix[i]].t; j++; } } ip = j; } int main() { int k; scanf("%d", &k); for (int i=0;i<k;i++) { scanf("%d", &n); for (int i=0;i<n;i++) scanf("%d%d%d", &l[i], &a[i], &b[i]); ip = 0; for (int i=0;i<n;i++) { ix[ip] = ip; pairs[ip].t = a[i]; pairs[ip].v = -l[i]; ip++; ix[ip] = ip; pairs[ip].t = b[i]; pairs[ip].v = l[i]; ip++; } qsort(ix, ip, sizeof(int), cmp); //show(); int lix = 0; for (int i=0;i<ip;i++) { if (pairs[ix[i]].t!=pairs[ix[lix]].t) { norm(lix, i-1); lix = i; } } norm(lix, ip-1); //show(); empty(); if (ip==0) { printf("TAK\n"); continue ; } if (0!=balance() || pairs[ix[0]].v>0 || pairs[ix[ip-1]].v>0) { printf("NIE\n"); continue ; } if (showE()) printf("TAK\n"); else printf("NIE\n"); } } |