平面内有多个矩形,求矩形重叠数最多的区域包含的矩形数量?

本文介绍了一种计算平面上多个矩形重叠区域的方法。通过输入矩形的坐标,使用离散化技术来统计每个小方块被覆盖的次数,最终找出重叠次数最多的区域及其覆盖的矩形数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.*;

/**
 * 平面内有多个矩形,求矩形重叠数最多的区域包含的矩形数量?
 * 输入:
 * 3
 * 0 1 1
 * 0 1 1
 * 2 3 4
 * 2 3 4
 * 解释:
 * 3:矩形个数
 * (0,0)矩形1左下端点,(2,2)矩形1右上端点
 * (1,1)矩形2左下端点,(3,3)矩形2右上端点
 * (1,1)矩形3左下端点,(4,4)矩形3右上端点
 * 输出:
 * 3
 *
 */
public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    sc.nextLine();
    HashSet<Integer> rowsSet = new HashSet<>();
    HashSet<Integer> colsSet = new HashSet<>();
    int[][] recs = new int[4][n];
    for (int i = 0; i < 4 * n; i++) {
      int val = sc.nextInt();
      recs[i / n][i % n] = val;
      if ((i / n) % 2 == 0 && !rowsSet.contains(val)) {
        rowsSet.add(val);
      }
      if ((i / n) % 2 == 1 && !colsSet.contains(val)) {
        colsSet.add(val);
      }
    }

    int[] rowsArr = new int[rowsSet.size()];
    int[] colsArr = new int[colsSet.size()];
    Iterator<Integer> rowsIt = rowsSet.iterator();
    int idx = 0;
    while (rowsIt.hasNext()) {
      rowsArr[idx++] = rowsIt.next();
    }
    Arrays.sort(rowsArr);
    Iterator<Integer> colsIt = colsSet.iterator();
    idx = 0;
    while (colsIt.hasNext()) {
      colsArr[idx++] = colsIt.next();
    }
    Arrays.sort(colsArr);
    // 离散化(统计每个小方块的覆盖次数)
    int[][] pieces = new int[rowsSet.size() - 1][colsSet.size() - 1];
    for (int i = 0; i < n; i++) {
      int left = Arrays.binarySearch(rowsArr, recs[0][i]);
      int right = Arrays.binarySearch(rowsArr, recs[2][i]);
      int bottom = Arrays.binarySearch(colsArr, recs[1][i]);
      int top = Arrays.binarySearch(colsArr, recs[3][i]);
      for (int j = left; j < right; j++) {
        for (int k = bottom; k < top; k++) {
          pieces[j][k]++;
        }
      }
    }
    int res = 1;
    for (int i = 0; i < pieces.length; i++) {
      for (int j = 0; j < pieces[0].length; j++) {
        res = Math.max(pieces[i][j], res);
      }
    }
    System.out.println(res);
    sc.close();
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值