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); }
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); }