题目描述
在平面内有一些矩形,它们的两条边都平行于坐标轴。
我们称一个点被某个矩形覆盖,是指这个点在矩形的内部或者边界上。
请问,被奇数个矩形覆盖和被偶数 (≥ 2)(≥2) 个矩形覆盖的点的面积分别是多少?
输入描述
输入的第一行包含一个整数 nn,表示矩形的个数。
接下来 nn 行描述这些矩形,其中第 ii 行包含四个整数 l_i,b_i, r_i, t_ili,bi,ri,ti,表示矩形的两个对角坐标分别为 (l_i, b_i),(r_i, t_i)(li,bi),(ri,ti)。
其中,1 ≤ n ≤ 10^5, 0 ≤ l_i < r_i ≤ 10^9, 0 ≤ b_i < t_i ≤ 10^91≤n≤105,0≤li
输出描述
输出两行。
第一行包含一个整数,表示被奇数个矩形覆盖的点的面积。
第二行包含一个整数,表示被偶数 (≥ 2)(≥2) 个矩形覆盖的点的面积。
输入输出样例
示例 1
输入
输出
运行限制
精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课
==================================
只通过了样例、提交检测未通过?为什么呢?
做法:模拟
import java.util.Scanner;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[][] rectangles = new int[n][4];
int minX = Integer.MAX_VALUE, minY = Integer.MAX_VALUE,
maxX = Integer.MIN_VALUE, maxY = Integer.MIN_VALUE;
for (int i = 0; i < n; i++) {
rectangles[i][0] = scan.nextInt();
rectangles[i][1] = scan.nextInt();
rectangles[i][2] = scan.nextInt();
rectangles[i][3] = scan.nextInt();
int x1 = rectangles[i][0], y1 = rectangles[i][1], x2 = rectangles[i][2], y2 = rectangles[i][3];
minX = Math.min(minX, x1);
minY = Math.min(minY, y1);
maxX = Math.max(maxX, x2);
maxY = Math.max(maxY, y2);
int[][] pos = new int[maxX][maxY];
for (int i = 0; i < n; i++) {
int x1 = rectangles[i][0], y1 = rectangles[i][1], x2 = rectangles[i][2], y2 = rectangles[i][3];
for (int x = x1; x < x2; x++) {
for (int y = y1; y < y2; y++) {
for (int i = minX; i < maxX; i++) {
for (int j = minY; j < maxY; j++) {
if (pos[i][j] == 0) continue;
if (pos[i][j] % 2 == 1) cntJ++;
else if (pos[i][j] != 0) cntO++;
System.out.println(cntJ);
System.out.println(cntO);

C++代码(题解提供的)
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
bool operator<(const Seg&w)const
return x
return lower_bound(v.begin(),v.end(),x)-v.begin();
tr[u].len1=tr[u<<1].len2+tr[u<<1|1].len2;
tr[u].len2=tr[u<<1].len1+tr[u<<1|1].len1;
tr[u].len1+=v[tr[u].r+1]-v[tr[u].l]-tr[u].len1-tr[u].len2;
tr[u].len1=tr[u<<1].len1+tr[u<<1|1].len1;
tr[u].len2=tr[u<<1].len2+tr[u<<1|1].len2;
tr[u].len2+=v[tr[u].r+1]-v[tr[u].l]-tr[u].len1-tr[u].len2;
else if(tr[u].l!=tr[u].r)
tr[u].len1=tr[u<<1].len1+tr[u<<1|1].len1;
tr[u].len2=tr[u<<1].len2+tr[u<<1|1].len2;
tr[u].len1=tr[u].len2 = 0;
void build(int u,int l,int r)
void mdf(int u,int l,int r,int k){
if(tr[u].l>=l && tr[u].r<=r)
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid) mdf(u<<1,l,r,k);
if(r>mid) mdf(u<<1|1,l,r,k);
v.erase(unique(v.begin(),v.end()),v.end());
build(1,0,(int)v.size()-2);
for(int i=0;i
res1+=1ll*(seg[i].x-seg[i-1].x)*tr[1].len1;
res2+=1ll*(seg[i].x-seg[i-1].x)*tr[1].len2;
mdf(1,get(seg[i].l),get(seg[i].r)-1,seg[i].k);
-
-
相关阅读:
Cryptocell-712安全引擎概述
MySQL InnoDB 引擎底层解析(三)
npm ERR! exited with error code: 128
【文件系统】如何在ubi之上运行squashfs
C语言学习/复习32--位段内存分配/枚举与联合体在内存中的特点
linux第四课:改变文件的权限和属性(内含:1.修改权限命令chmod+2.临时切换用户用 sudo+3.chowm:改变文件所有者)
ZooKeeper的Linux端安装步骤(内含Java的Linux端安装)
在进行自动化测试,遇到验证码的问题,怎么办?
如何撰写一份优秀的活动策划与执行方案?这些步骤和技巧请收好
测试/开发程序员的思考,突破变得更强......
-
原文地址:https://blog.csdn.net/weixin_45322373/article/details/127705933