Пример #1
0
    bool check(int D)
    {
        SegTree Seg = new SegTree(2 * N);

        for (int i = 0; i < N; i++)
        {
            Seg.Add(Seg.ToLeaf(Q[i]), Seg.ToLeaf(Q[i + N]), true, true);
        }
        for (int i = Seg.segf - 1; i >= 0; i--)
        {
            int sl = i * 2 + 1;
            int sr = i * 2 + 2;
            Seg.Add(i, sl, true, false);
            Seg.Add(i, sr, true, false);
        }
        for (int i = 0; i < 2 * N - 1; i++)
        {
            int Pi = P[i] >= N ? Y[P[i] - N] : X[P[i]];
            int bf = i;
            int bl = 2 * N - 1;
            while (bf != bl)
            {
                int bc = (bf + bl + 1) / 2;
                if (Pi + D > (P[bc] >= N ? Y[P[bc] - N] : X[P[bc]]))
                {
                    bf = bc;
                }
                else
                {
                    bl = bc - 1;
                }
            }
            if (bl != i)
            {
                Seg.Add(i + 1, bl, i);
            }
        }
        TwoSatSolver T = new TwoSatSolver(4 * N - 1, Seg.vs.ToArray(), Seg.us.ToArray(), Seg.vb.ToArray(), Seg.ub.ToArray());

        return(T.Answer());
    }
Пример #2
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");
    }