import java.util.*; public class Main { static class Car { long x; // 使用long避免位置值过大导致溢出 int v; Car(long x, int v) { this.x = x; this.v = v; } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); Car[] cars = new Car[n]; for (int i = 0; i < n; i++) { long x = scanner.nextLong(); int v = scanner.nextInt(); cars[i] = new Car(x, v); } // 按位置排序,位置小的车在后面,位置大的车在前面 Arrays.sort(cars, (a, b) -> Long.compare(a.x, b.x)); // 提取速度序列 int[] speeds = new int[n]; for (int i = 0; i < n; i++) { speeds[i] = cars[i].v; } // 找出最长非递增子序列的长度 int maxNonIncreasing = longestNonIncreasingSubsequence(speeds); // 需要移除的车辆数 = 总车辆数 - 最长非递增子序列的长度 System.out.println(n - maxNonIncreasing); } // 计算最长非递增子序列的长度,使用O(n log n)算法 private static int longestNonIncreasingSubsequence(int[] nums) { if (nums == null || nums.length == 0) { return 0; } List<Integer> tails = new ArrayList<>(); for (int num : nums) { // 找到第一个小于num的位置(二分查找) int left = 0, right = tails.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (tails.get(mid) <= num) { left = mid + 1; } else { right = mid - 1; } } if (left == tails.size()) { tails.add(num); } else { tails.set(left, num); } } return tails.size(); } }