HDU 1225 覆盖的面积
HDU_1225
拓展一下求K次覆盖的矩形的并的话就是UVA_11983那个题了。感觉上用线段树处理矩形的并,首先就是要标记出哪些区间被覆盖了,其次就是要用类似dp的思想,用cover[i][j]表示在线段树上的节点i表示的范围内,覆盖了j次的线段总长度,同时cover[i][K]表示的是覆盖了K次及大于K次的线段的总长度,然后依据左右儿子的状态来更新cover[i][j]的状态。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define MAXD 2010 #define zero 1e-8 int N, M, cnt[4 * MAXD], K = 2; double ty[MAXD], cover[4 * MAXD][3]; struct Seg {double x, y1, y2;int col; }seg[MAXD]; int cmpy(const void *_p, const void *_q) {double *p = (double *)_p, *q = (double *)_q;return *p < *q ? -1 : 1; } int cmps(const void *_p, const void *_q) {Seg *p = (Seg *)_p, *q = (Seg *)_q;return p->x < q->x ? -1 : 1; } int dcmp(double x) {return fabs(x) < zero ? 0 : (x < 0 ? -1 : 1); } void build(int cur, int x, int y) {int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1;memset(cover[cur], 0, sizeof(cover[cur]));cover[cur][0] = ty[y + 1] - ty[x];cnt[cur] = 0;if(x == y)return ;build(ls, x, mid);build(rs, mid + 1, y); } void init() {int i, j, k;double x1, x2, y1, y2;scanf("%d", &N);for(i = 0; i < N; i ++){j = i << 1, k = (i << 1) | 1;scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);seg[j].x = x1, seg[k].x = x2;seg[j].y1 = seg[k].y1 = y1, seg[j].y2 = seg[k].y2 = y2;seg[j].col = 1, seg[k].col = -1;ty[j] = y1, ty[k] = y2;}qsort(ty, N << 1, sizeof(ty[0]), cmpy);M = (N << 1) - 1;build(1, 0, M - 1); } void update(int cur, int x, int y) {int ls = cur << 1, rs = (cur << 1) | 1;memset(cover[cur], 0, sizeof(cover[cur]));if(cnt[cur] >= K)cover[cur][K] = ty[y + 1] - ty[x];else if(x == y)cover[cur][cnt[cur]] = ty[y + 1] - ty[x];else{int i;for(i = cnt[cur]; i <= K; i ++)cover[cur][i] += cover[ls][i - cnt[cur]] + cover[rs][i - cnt[cur]];for(i = K - cnt[cur] + 1; i <= K; i ++)cover[cur][K] += cover[ls][i] + cover[rs][i];} } void refresh(int cur, int x, int y, int s, int t, int c) {int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1;if(x >= s && y <= t){cnt[cur] += c;update(cur, x, y);return ;}if(mid >= s)refresh(ls, x, mid, s, t, c);if(mid + 1 <= t)refresh(rs, mid + 1, y, s, t, c);update(cur, x, y); } int BS(double x) {int min = 0, max = M + 1, mid;for(;;){mid = (min + max) >> 1;if(mid == min)break;if(dcmp(ty[mid] - x) <= 0)min = mid;elsemax = mid;}return mid; } void solve() {int i, j, k;double ans = 0;qsort(seg, N << 1, sizeof(seg[0]), cmps);seg[N << 1].x = seg[(N << 1) - 1].x;for(i = 0; i < (N << 1); i ++){j = BS(seg[i].y1), k = BS(seg[i].y2);if(j < k)refresh(1, 0, M - 1, j, k - 1, seg[i].col);ans += cover[1][K] * (seg[i + 1].x - seg[i].x);}printf("%.2f\n", ans); } int main() {int t;scanf("%d", &t);while(t --){init();solve();}return 0; }
HDU 1225 覆盖的面积相关推荐
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- hdu 1255 覆盖的面积 (扫描线求矩形交)
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- hdu 1255 覆盖的面积
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- HDU 1255 覆盖的面积(线段树+扫描线)
题目地址:HDU 1255 这题跟面积并的方法非常像,仅仅只是须要再加一个变量. 刚開始我以为直接用那个变量即可,仅仅只是推断是否大于0改成推断是否大于1.可是后来发现了个问题,由于这个没有下放,没延 ...
- HDU - 1255 覆盖的面积(线段树+扫描线)
题目链接:点击查看 题目大意:中文题面,简单明了,不多赘述 题目分析:这个题可以理解为Atlantis的升级版,其实完全可以对Atlantis这道题目的代码稍加修改就可以交上这个题,关键是如何修改?一 ...
- hdu 1255 覆盖的面积 (Bruceforce)
Problem - 1255 暴力统计覆盖超过一次的区域.1y. 代码如下: 1 #include <cstdio> 2 #include <cstring> 3 #inclu ...
- HDU1255 覆盖的面积 (线段树 + 扫描线)
题目链接:覆盖的面积 大致题意 现在有平面直角坐标系xoy, 有n个平行于x轴y轴的矩形, 给出这些矩形的左上角和右下角的坐标, 让你求出这些矩形组成的图形中被至少两个矩形覆盖的部分的总面积. 解题思 ...
- hdu 1542/1255 Atlantis/覆盖的面积
1542 1255 两道扫描线+线段树的入门题. 基本没有什么区别,前者是模板,后者因为是求覆盖次数至少在两次以上的,这个同样是具有并集性质的,所以把cover的判断条件更改一下就可以了qwq. hd ...
- HDU-1255 覆盖的面积 矩形面积交
http://acm.hdu.edu.cn/showproblem.php?pid=1255 题义为给定N个矩形,求其重叠的图形面积,该题采用线段树离散化y轴坐标,并且采用分割思想,只依据x坐标来进行 ...
最新文章
- 十问 | 关于Service Mesh 和Kubernets的最前沿思考
- Java异常处理-----java异常体系
- Qt事件传递相关问题
- 方便微信公众号等手机网页调试插件eruda和vConsole
- php连接mysql开发环境_Windows下安装PHP开发环境
- mysql自动填充_Mysql自动填充测试数据
- java date 日期部分_Java处理Date时间格式的各种场景工具类(二)
- 模板使用自定义类型_自定义虚幻图表_拓展蓝图功能
- git下载、安装、配置与简单应用(git上路之始)
- excel合并两列内容_一起来学习Excel表格两列合并一列的两种方法
- 强烈分享8个功能强大,可以极大提高工作效率的软件
- 业务安全之接口调用安全
- recover 没有捕获异常_Recover捕获异常
- 什么是公约数/公因数
- 如何看计算机几核,如何查看电脑CPU是几核的?,这几步你要了解
- css 控制 段落 超出三行的部分显示...
- 央央家政解读:月嫂服务内容和标准
- AI 与合成生物学「联姻」的五大挑战:技术、数据、算法、评估与社会学
- day1 Flappy bird项目介绍
- 2017二本各大学计算机分数线,2017年二本院校排名及分数线
热门文章
- 光流 | OpenCV3实现LK Optical Flow(代码类)
- 什么是typora,什么是markdown?利用typora编写markdown文本
- 阿里云 nginx php mysql_阿里云 Ubuntu + Nginx + PHP + MySQL
- Win32 串口编程(三)
- 计算机辅助语言和计算语言学关系,建构主义理论视角下计算机辅助语言学习环境对留学生学习汉语动机的影响——以广西大学泰国留学生为例-语言学及应用语言学专业论文.docx...
- python横坐标如何显示为月份_如何显示给定两个日期之间的所有月份?
- C语言isalnum函数举例,C语言中的isalnum()函数
- kafka consumer配置拉取速度慢_Kafka分区分配策略(Partition Assignment Strategy)
- 第四范式裴沵思出席绿公司年会:传统企业要尽快完成在线化武装
- sqlite 日期格式与排序问题