题目

X星球的一批考古机器人正在一片废墟上考古。
该区域的地面坚硬如石、平整如镜。
管理人员为方便,建立了标准的直角坐标系。

每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。
经过各种测量,每个机器人都会报告一个或多个矩形区域,作为优先考古的区域。

矩形的表示格式为(x1,y1,x2,y2),代表矩形的两个对角点坐标。

为了醒目,总部要求对所有机器人选中的矩形区域涂黄色油漆。
小明并不需要当油漆工,只是他需要计算一下,一共要耗费多少油漆。

其实这也不难,只要算出所有矩形覆盖的区域一共有多大面积就可以了。
注意,各个矩形间可能重叠。

本题的输入为若干矩形,要求输出其覆盖的总面积。

输入格式:
第一行,一个整数n,表示有多少个矩形(1<=n<10000)
接下来的n行,每行有4个整数x1 y1 x2 y2,空格分开,表示矩形的两个对角顶点坐标。
(0<= x1,y1,x2,y2 <=10000)

输出格式:
一行一个整数,表示矩形覆盖的总面积面积。

例如,
输入:
3
1 5 10 10
3 1 20 20
2 7 15 17

程序应该输出:
340

再例如,
输入:
3
5 2 10 6
2 7 12 10
8 1 15 15

程序应该输出:
128

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

代码


#include <stdio.h>using namespace std;
int n, sum = 0;
bool p[10005][10005];void paint(int x1, int y1, int x2, int y2) {for (int i = x1; i < x2; i++) {for (int j = y1; j < y2; j++) {p[i][j] = 1;}}
}int main(int argc, const char *argv[]) {scanf("%d", &n);for (int i = 0; i < n; i++) {int x1, y1, x2, y2;scanf("%d %d %d %d", &x1, &y1, &x2, &y2);paint(x1, y1, x2, y2);}for (int i = 0; i < 10005; i++) {for (int j = 0; j < 10005; j++) {if (p[i][j])sum++;}}printf("%d\n", sum);
}
#include <stdio.h>
#include <algorithm>using namespace std;/*辅助的数据结构:扫描线*/
struct Line {int x1, x2, h, f;//左右坐标,纵坐标(高度),f=1为入边,f=-1为出边Line() {}Line(int _l, int _r, int _h, int _f) : x1(_l), x2(_r), h(_h), f(_f) {}/*按高度排序*/bool operator<(const Line &l) const {return h < l.h;}
};/*线段树的定义*/
struct SegTree {int pl, pr, cnt, len;//左端点编号,右端点编号,被覆盖次数,两个端点之间被覆盖的长度SegTree() : cnt(0), len(0) {}SegTree *lson, *rson;
};const int N = 10000;
int n;
int X[N << 1];//记录所有的横坐标
//int PL=0,PR;
Line lines[N];/*构建区间树*/
SegTree *buildTree(int pl, int pr) {SegTree *t = new SegTree();t->pl = pl;t->pr = pr;if (pl == pr)return t;int mid = ((pl + pr) >> 1);t->lson = buildTree(pl, mid);t->rson = buildTree(mid + 1, pr);return t;
}void updateLength(SegTree *pTree, int tl, int tr) {if (pTree->cnt) {pTree->len = X[tr] - X[tl-1];//将区间树上的端点(序号)反入到X中求得二维坐标上的实际横坐标} else if (tl == tr) {pTree->len = 0;} else {//负数pTree->len = pTree->lson->len + pTree->rson->len;}}void update(SegTree *tree, int pl, int pr, int value) {int tl = tree->pl;int tr = tree->pr;if (pl <= tl && pr >= tr) {tree->cnt += value;updateLength(tree, tl, tr);return;;}int m = (tl + tr) >> 1;if (pl <= m) update(tree->lson, pl, pr, value);if (pr > m) update(tree->rson, pl, pr, value);updateLength(tree, tl, tr);}int ans;int main(int argc, const char *argv[]) {scanf("%d", &n);int x1, y1, x2, y2;int index = 0;for (int i = 0; i < n; i++) {scanf("%d %d %d %d", &x1, &y1, &x2, &y2);X[index] = x1;lines[index] = Line(x1, x2, y1, 1);//高度1index++;X[index] = x2;lines[index] = Line(x1, x2, y2, -1);//高度2index++;}
//    大体上就有了2n个横坐标,2n条水平线段sort(X, X + index);//所有横坐标点排序sort(lines, lines + index);//扫描线排序,从低到高/*离散化横坐标*/int X_end = unique(X, X + index) - X;//去重返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素
//    PR=X_end;
//    初始化线段树SegTree *root = buildTree(1, X_end);
//    从低到高,遍历扫描线for (int i = 0; i < index; ++i) {int pl = lower_bound(X, X + X_end, lines[i].x1) - X;//二分查找,记录下标,代表是第几个点int pr = lower_bound(X, X + X_end, lines[i].x2) - X;//二分查找,记录下标,代表是第几个点update(root, pl+1, pr, lines[i].f);ans += root->len * (lines[i + 1].h - lines[i].h);//宽度*高度}printf("%d\n", ans);return 0;
}

征战蓝桥 —— 2017年第八届 —— C/C++A组第10题——油漆面积相关推荐

  1. 征战蓝桥 —— 2017年第八届 —— C/C++A组第5题——字母组串

    题目 由 A,B,C 这3个字母就可以组成许多串. 比如:"A","AB","ABC","ABA","AACB ...

  2. 征战蓝桥 —— 2017年第八届 —— C/C++A组第6题——最大公共子串

    题目 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最长的 ...

  3. 征战蓝桥 —— 2017年第八届 —— C/C++A组第9题——分巧克力

    题目 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形.为了公平起见,小明需要从这 N 块巧克力中切出K块巧 ...

  4. 征战蓝桥 —— 2014年第五届 —— C/C++A组第10题——波动数列

    题目 观察这个数列: 1 3 0 2 -1 1 -2 ...这个数列中后一项总是比前一项增加2或者减少3.栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b的整 ...

  5. 征战蓝桥 —— 2013年第四届 —— C/C++A组第10题——大臣的旅费

    大臣的旅费 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市.为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首 ...

  6. 征战蓝桥 —— 2014年第五届 —— C/C++A组第5题——锦标赛

    题目 如果要在n个数据中挑选出第一大和第二大的数据(要求输出数据所在位置和值),使用什么方法比较的次数最少? 我们可以从体育锦标赛中受到启发. 如图[1.png]所示,8个选手的锦标赛,先两两捉对比拼 ...

  7. 征战蓝桥 —— 2014年第五届 —— C/C++A组第6题——扑克排序

    题目 A A 2 2 3 3 4 4, 一共4对扑克牌.请你把它们排成一行. 要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌.请填写出所有符合要求的排列中,字典序 ...

  8. 征战蓝桥 —— 2014年第五届 —— C/C++A组第8题——地宫取宝

    题目 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签.地宫的入口在左上角,出口在右下角.小明被带到地宫的入口,国王要求他只能向右或向下行走.走过某个格子 ...

  9. 征战蓝桥 —— 2014年第五届 —— C/C++A组第9题——斐波那契

    题目 斐波那契数列大家都非常熟悉.它的定义是:f(x) = 1 .... (x=1,2) f(x) = f(x-1) + f(x-2) .... (x>2)对于给定的整数 n 和 m,我们希望求 ...

最新文章

  1. R语言交互式可视化包CanvasXpress
  2. 二维数组,锯齿数组和集合 C# 一维数组、二维数组(矩形数组)、交错数组(锯齿数组)的使用 C# 数组、多维数组(矩形数组)、锯齿数组(交叉数组)...
  3. php中控车牌识别push协议,车牌识别一体机的RS485小接口——实现透明传输!
  4. php fetchall 返回值为0_PHP实现延迟执行程序
  5. 3 上传分段_32式太极拳教材分段教学:【3】32式太极拳背向演示 .3/25.
  6. php ssh tab补全,bash的按TAB键自动补全(自动完成)的原理与扩展
  7. 好快!京东推出全新快递服务: 最快30分钟送达
  8. 在Kubernetes上使用Sateful Set部署RabbitMQ集群
  9. ofd 文件发票解析
  10. 【LabVIEW】基于LabVIEW的2048游戏设计
  11. JAVA 中的修饰符的适用范围
  12. 鼠标点击事件对象的clientX、pageX、offsetX、screenX、x
  13. 2022年京东618店庆活动优惠力度怎么样?
  14. C语言实现计算数的整数次幂
  15. MX_Player_Pro_专业精简版AC3/DTS/EAC3 By.SOLDIER-就要应用网91apps.cn
  16. 3 个技巧教你轻松查看多开模拟器的端口号~
  17. sci论文图排版技巧分享
  18. 改进duilib的richedit控件的部分功能
  19. Linux centOS 7下安装配置Tomcat
  20. 英特尔助力腾讯云深度优化云硬盘CBS 产品,打造极速云存储体验

热门文章

  1. Fragment 生命周期:
  2. 关于void main()的误区
  3. 微信公众号页面支付接口java,[Java教程]微信公众号支付(三):页面调用微信支付JS并完成支付...
  4. python删除字符串中的空格保留一个_Python从字符串中隔开的字母中删除单个空格的最快方法...
  5. android webview 获取图片,Android – 保存WebView中的图片
  6. 深入浅出谈cuda 书_入门和基础——9本关于美学的书
  7. 列表数据提交_Mybatis-实现数据的增删改查
  8. linux 跨IP拷贝命令 scp
  9. 在VS2012中安装使用cppcheck
  10. 【倍增】7.11fusion