Exemplo n.º 1
0
    void Calc()
    {
        string[] str = Console.ReadLine().Split(' ');
        int      N   = int.Parse(str[0]) + 1;
        int      Q   = int.Parse(str[1]);
        int      A   = int.Parse(str[2]);
        int      B   = int.Parse(str[3]);

        str = Console.ReadLine().Split(' ');
        SegTree SegM = new SegTree(N, this);
        SegTree SegP = new SegTree(N, this);

        {
            int q0 = int.Parse(str[0]);
            for (int i = 2 * N - 2; i >= 0; i--)
            {
                if (i >= SegM.segf)
                {
                    if (SegM.ToPoint(i) == A)
                    {
                        SegM.X[i] = Math.Max(q0 - B, B - q0) - SegM.ToPoint(i);
                    }
                    else if (SegM.ToPoint(i) == B)
                    {
                        SegM.X[i] = Math.Max(q0 - A, A - q0) - SegM.ToPoint(i);
                    }
                    else
                    {
                        SegM.X[i] = Define.INF;
                    }
                }
                else
                {
                    int sl = i * 2 + 1;
                    int sr = i * 2 + 2;
                    SegM.X[i] = Math.Min(SegM.X[sl], SegM.X[sr]);
                }
            }
            for (int i = 2 * N - 2; i >= 0; i--)
            {
                if (i >= SegP.segf)
                {
                    if (SegP.ToPoint(i) == A)
                    {
                        SegP.X[i] = Math.Max(q0 - B, B - q0) + SegP.ToPoint(i);
                    }
                    else if (SegM.ToPoint(i) == B)
                    {
                        SegP.X[i] = Math.Max(q0 - A, A - q0) + SegP.ToPoint(i);
                    }
                    else
                    {
                        SegP.X[i] = Define.INF;
                    }
                }
                else
                {
                    int sl = i * 2 + 1;
                    int sr = i * 2 + 2;
                    SegP.X[i] = Math.Min(SegP.X[sl], SegP.X[sr]);
                }
            }
        }
        for (int i = 1; i < Q; i++)
        {
            int  qb = int.Parse(str[i - 1]);
            int  q  = int.Parse(str[i]);
            long V  = Math.Min(SegP.GetMin(q, N - 1) - q, SegM.GetMin(0, q) + q);
            SegP.AllAdd(Math.Max(qb - q, q - qb));
            SegP.Insert(qb, V + qb);
            SegM.AllAdd(Math.Max(qb - q, q - qb));
            SegM.Insert(qb, V - qb);
        }
        long count = Define.INF;

        for (int i = 0; i < N; i++)
        {
            count = Math.Min(count, SegP.X[SegP.ToLeaf(i)] - i);
        }
        count += SegP.L;
        sb.Append(count + "\n");
    }