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
   | #include <bits/stdc++.h> using namespace std; struct node {     int a, num;     bool operator<(const node &x) const     {         return a > x.a;     } } p[3005]; int n, res[3005], st[30][3005]; void init() {     int i, j, t = log2(n);     for (i = 1; i <= n; i++)         st[0][i] = p[i].a - p[i + 1].a;     for (j = 1; j <= t; j++)     {         for (i = 1; i <= n - (1 << j) + 1; i++)             st[j][i] = max(st[j - 1][i], st[j - 1][i + (1 << (j - 1))]);     } } int maxs(int l, int r) {     int t = log2(r - l + 1);     return max(st[t][l], st[t][r - (1 << t) + 1]); } int main() {     int i, j, k, e1, e2, e3, d12 = -1, d23 = -1, d34 = -1, lj, rj, lk, rk;     scanf("%d", &n);     for (i = 1; i <= n; i++)     {         scanf("%d", &p[i].a);         p[i].num = i;     }     sort(p + 1, p + 1 + n);     p[n + 1].a = 0;     init();     bool flag1, flag2;     for (i = 1; i <= n - 2; i++)     {         lj = i + ((i + 1) >> 1);         rj = min(n - 1, i + (i << 1));         flag1 = (d12 < p[i].a - p[i + 1].a);         if (d12 <= p[i].a - p[i + 1].a && lj <= rj)         {             for (j = lj; j <= rj; j++)             {                 lk = j + max((i + 1) >> 1, (j - i + 1) >> 1);                 rk = min(n, j + min(i << 1, (j - i) << 1));                 flag2 = (d23 <= p[j].a - p[j + 1].a);                 if ((d12 < p[i].a - p[i + 1].a || d23 <= p[j].a - p[j + 1].a) && lk <= rk)                 {                     if (d12 < p[i].a - p[i + 1].a || d23 < p[j].a - p[j + 1].a || d34 < maxs(lk, rk))                     {                         e1 = i;                         e2 = j;                         d12 = p[i].a - p[i + 1].a;                         d23 = p[j].a - p[j + 1].a;                         d34 = -1;                         for (k = lk; k <= rk; k++)                         {                             if (d34 < p[k].a - p[k + 1].a)                             {                                 d34 = p[k].a - p[k + 1].a;                                 e3 = k;                             }                         }                     }                 }             }         }     }     for (i = 1; i <= e1; i++)         res[p[i].num] = 1;     for (i = e1 + 1; i <= e2; i++)         res[p[i].num] = 2;     for (i = e2 + 1; i <= e3; i++)         res[p[i].num] = 3;     for (i = e3 + 1; i <= n; i++)         res[p[i].num] = -1;     for (i = 1; i <= n; i++)         printf("%d ", res[i]);     return 0; }
   |