Algo Algo   C++   C#   Demo   JS   Py   SQL   Stat   TA

Problem : Airports

//------------------------------------------------------------------------------
// Airports                                                                   C#
//------------------------------------------------------------------------------
FIO fio = new FIO();

int Q = fio.ReadInt();
for (int q = 0; q < Q; q++)
{
    int N = fio.ReadInt();
    int D = fio.ReadInt();
    int[] X = fio.ReadIntArr(N);

    int[] C = new int[N];

    RedBlackTree<int> in_ports = new RedBlackTree<int>(Comparer<int>.Default);
    RedBlackTree<int> in_gaps = new RedBlackTree<int>(Comparer<int>.Default);

    int li = 0;
    int ri = 1;
    if (X[1] < X[0]) { li = 1; ri = 0; }

    C[1] = Math.Max(0, D - (X[ri] - X[li]));

    int item;

    for (int ix = 2; ix < N; ix++)
    {
        int xmin_in_ports = in_ports.ElementCount > 0 &&
                            in_ports.FirstItemInRange(in_ports.EntireRange,
                                                      out item) != -1 ? item : 0;
        int xmax_in_ports = in_ports.ElementCount > 0 &&
                            in_ports.LastItemInRange(in_ports.EntireRange,
                                                     out item) != -1 ? item : 0;

        if (X[ix] <= X[li])
        {
            if (in_ports.ElementCount > 0)
                in_gaps.Insert(xmin_in_ports - X[li], DuplicatePolicy.InsertLast,
                               out item);
            in_ports.Insert(X[li], DuplicatePolicy.InsertFirst, out item);
            li = ix;
        }
        else
        if (in_ports.ElementCount > 0 && X[ix] <= xmin_in_ports)
        {
            in_gaps.Insert(xmin_in_ports - X[ix], DuplicatePolicy.InsertLast,
                           out item);
            in_ports.Insert(X[ix], DuplicatePolicy.InsertFirst, out item);
        }
        else
        if (X[ix] >= X[ri])
        {
            if (in_ports.ElementCount > 0)
                in_gaps.Insert(X[ri] - xmax_in_ports, DuplicatePolicy.InsertLast,
                               out item);
            in_ports.Insert(X[ri], DuplicatePolicy.InsertLast, out item);
            ri = ix;
        }
        else
        if (in_ports.ElementCount > 0 && X[ix] >= xmax_in_ports)
        {
            in_gaps.Insert(X[ix] - xmax_in_ports, DuplicatePolicy.InsertLast,
                           out item);
            in_ports.Insert(X[ix], DuplicatePolicy.InsertLast, out item);
        }
        else
        if (in_ports.ElementCount == 0)
        {
            in_ports.Insert(X[ix], DuplicatePolicy.InsertLast, out item);
        }
        else
        {
            in_ports.Insert(X[ix], DuplicatePolicy.InsertLast, out item);
            int index = in_ports.FindIndex(X[ix], false);
            int x_left = in_ports.GetItemByIndex(index - 1);
            int x_right = in_ports.GetItemByIndex(index + 1);
            in_gaps.Delete(x_right - x_left, false, out item);
            in_gaps.Insert(X[ix] - x_left, DuplicatePolicy.InsertLast, out item);
            in_gaps.Insert(x_right - X[ix], DuplicatePolicy.InsertLast, out item);
        }

        while (in_ports.ElementCount > 0 &&
               in_ports.FirstItemInRange(in_ports.EntireRange, out item) != -1 &&
               item <= X[ri] - D)
        {
            int deleted;
            in_ports.Delete(item, true, out deleted);
            if (in_ports.ElementCount > 0 &&
                in_ports.FirstItemInRange(in_ports.EntireRange, out item) != -1)
                in_gaps.Delete(item - deleted, false, out item);
        }
        while (in_ports.ElementCount > 0 &&
               in_ports.LastItemInRange(in_ports.EntireRange, out item) != -1 &&
               X[li] + D <= item)
        {
            int deleted;
            in_ports.Delete(item, false, out deleted);
            if (in_ports.ElementCount > 0 &&
                in_ports.LastItemInRange(in_ports.EntireRange, out item) != -1)
                in_gaps.Delete(deleted - item, false, out item);
        }

        C[ix] = Math.Max(0, D - (X[ri] - X[li]));
        if (in_ports.ElementCount > 0)
        {
            xmin_in_ports = in_ports.FirstItemInRange(in_ports.EntireRange,
                                                      out item) != -1 ? item : 0;
            xmax_in_ports = in_ports.LastItemInRange(in_ports.EntireRange,
                                                     out item) != -1 ? item : 0;

            int max_gap = 0;
            if (in_gaps.ElementCount == 0 ||
                in_gaps.LastItemInRange(in_gaps.EntireRange, out max_gap) == -1)
                max_gap = 0;
            max_gap = Math.Max(max_gap, xmin_in_ports - (X[ri] - D));
            max_gap = Math.Max(max_gap, (X[li] + D) - xmax_in_ports);

            C[ix] = Math.Max(C[ix], (X[li] + D) - (X[ri] - D) - max_gap);
        }
    }
    fio.WriteLine(string.Join(" ", C.Select(p => p.ToString()).ToArray()));
}

fio.Close();
//------------------------------------------------------------------------------
Algo Algo   C++   C#   Demo   JS   Py   SQL   Stat   TA