#include <stdio.h> #include <stdlib.h> struct SUM { int poz; int w; int o; }; struct SUM sum[500*1001]; int compare_poz(const void *arg1, const void *arg2) { return (((struct SUM *)arg1)->poz - ((struct SUM *)arg2)->poz); } int compare_w(const void *arg1, const void *arg2) { return (((struct SUM *)arg1)->w - ((struct SUM *)arg2)->w); } int n; int is_king(int k) { long long int ws = sum[k].w; for(int i = 0; i < n; i++) { if(i == k) { continue; } if(sum[i].w >= ws) { return 0; } ws += sum[i].w; } sum[k].o = 1; return 1; } void bisect(int l, int r) { if( l > r) { return; } if(l == r) { if(r != n) { is_king(r); } return; } if (l+1 == r) { is_king(l); if(r != n) { is_king(r); } return; } int mid = l + (r-l) / 2; int king = is_king(mid); if(king == 0) { bisect(mid+1, r); } else { bisect(l, mid); } } int main() { scanf("%d", &n); for(int i = 0; i < n; i++) { sum[i].o = 0; sum[i].poz = i; scanf("%d", &(sum[i].w)); } qsort(sum, n, sizeof(*sum), compare_w); bisect(0, n); /* for(int i = 0; i < n; i++) { is_king(i); }*/ int o_current = 0; for(int i = 0; i < n; i++) { if(sum[i].o == 1) { o_current = 1; } sum[i].o = o_current; } /* int current_ws = sum[0].w; long long int equal_weight_sum = 0; long long int weight_sum = 0; for(int i = 0; i < n; i++) { if(sum[i] == sum[0].w) { equal_weight_sum } }*/ qsort(sum, n, sizeof(*sum), compare_poz); for(int i = 0; i < n; i++) { if(sum[i].o == 1) { printf("T"); } else { printf("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 | #include <stdio.h> #include <stdlib.h> struct SUM { int poz; int w; int o; }; struct SUM sum[500*1001]; int compare_poz(const void *arg1, const void *arg2) { return (((struct SUM *)arg1)->poz - ((struct SUM *)arg2)->poz); } int compare_w(const void *arg1, const void *arg2) { return (((struct SUM *)arg1)->w - ((struct SUM *)arg2)->w); } int n; int is_king(int k) { long long int ws = sum[k].w; for(int i = 0; i < n; i++) { if(i == k) { continue; } if(sum[i].w >= ws) { return 0; } ws += sum[i].w; } sum[k].o = 1; return 1; } void bisect(int l, int r) { if( l > r) { return; } if(l == r) { if(r != n) { is_king(r); } return; } if (l+1 == r) { is_king(l); if(r != n) { is_king(r); } return; } int mid = l + (r-l) / 2; int king = is_king(mid); if(king == 0) { bisect(mid+1, r); } else { bisect(l, mid); } } int main() { scanf("%d", &n); for(int i = 0; i < n; i++) { sum[i].o = 0; sum[i].poz = i; scanf("%d", &(sum[i].w)); } qsort(sum, n, sizeof(*sum), compare_w); bisect(0, n); /* for(int i = 0; i < n; i++) { is_king(i); }*/ int o_current = 0; for(int i = 0; i < n; i++) { if(sum[i].o == 1) { o_current = 1; } sum[i].o = o_current; } /* int current_ws = sum[0].w; long long int equal_weight_sum = 0; long long int weight_sum = 0; for(int i = 0; i < n; i++) { if(sum[i] == sum[0].w) { equal_weight_sum } }*/ qsort(sum, n, sizeof(*sum), compare_poz); for(int i = 0; i < n; i++) { if(sum[i].o == 1) { printf("T"); } else { printf("N"); } } return 0; } |