Example #1
0
    void prog()
    {
        cin = new Scanner();

        int N = cin.nextInt();

        Pair[] box = new Pair[N];

        for (int i = 0; i < N; i++)
        {
            box[i] = new Pair(cin.nextInt(), cin.nextInt());
        }

        Array.Sort <Pair>(box, (a, b) => (a.Key > b.Key ? 1 : (a.Key < b.Key ? -1 : (a.Value < b.Value ? 1 : (a.Value > b.Value ? -1 : 0)))));
        SegTreeMax segtree = new SegTreeMax(100001);
        int        ans     = 0;

        for (int i = 0; i < N; i++)
        {
            int h   = box[i].Value;
            int now = segtree.getMax(0, h) + 1;
            ans = Math.Max(ans, now);
            segtree.add(h, now);
        }
        Console.WriteLine(ans);
    }
Example #2
0
    public void Solve()
    {
        if (N == 1)
        {
            Console.WriteLine(0);
            return;
        }

        for (int i = 0; i < N; i++)
        {
            Array.Sort(XY[i]);
        }
        Array.Sort(XY,
                   (a, b) => {
            if (a[0] == b[0])
            {
                return(a[1].CompareTo(b[1]));
            }
            return(a[0].CompareTo(b[0]));
        });

        var minST = new SegTreeMin[2];
        var maxST = new SegTreeMax[2];

        for (int i = 0; i < 2; i++)
        {
            minST[i] = new SegTreeMin(N);
            maxST[i] = new SegTreeMax(N);
            for (int j = 0; j < N; j++)
            {
                minST[i].Update(j, XY[j][i]);
                maxST[i].Update(j, XY[j][i]);
            }
        }

        var SH = new SkewHeap <Pair>();

        for (int i = 1; i < N; i++)
        {
            SH.Push(new Pair(i, XY[i][1]));
        }

        long ans = (maxST[0].Max - minST[0].Min) * (maxST[1].Max - minST[1].Min);

        while (SH.Count > 0)
        {
            var p   = SH.Top; SH.Pop();
            int idx = p.Pos;
            maxST[0].Update(idx, XY[idx][1]);
            maxST[1].Update(idx, XY[idx][0]);
            minST[0].Update(idx, XY[idx][1]);
            minST[1].Update(idx, XY[idx][0]);

            var v = (maxST[0].Max - minST[0].Min) * (maxST[1].Max - minST[1].Min);
            ans = Math.Min(ans, v);
        }

        Console.WriteLine(ans);
    }