2017 ACM-ICPC 亚洲区(南宁赛区)网络赛:Overlapping Rectangles
来源:互联网 发布:mysql 名称去重复连接 编辑:程序博客网 时间:2024/05/20 04:10
题目链接:https://nanti.jisuanke.com/t/17313
题目翻译:给出N个矩形的左下角坐标和右上角坐标,让求矩形面积的并。
这个题目有九百多人做出来了,因为这个是航电上的一个原题,就是HDU 1542
,那个题也是给出N个矩形的坐标,让求面积的并,利用线段树求矩形面积的并。
之前刚好做过这个题目。比赛时代码拿出来改了改就提交了。
题目思路在此链接:http://blog.csdn.net/wyxeainn/article/details/69934772
AC代码:
#include <iostream>#include <stdio.h>#include <algorithm>using namespace std;typedef long long LL;const int maxn = 1100;int n; ///矩形个数LL Y[4*maxn]; ///存放线的纵坐标struct Line{ LL x; ///横坐标的值 LL y1,y2; ///纵坐标的区间 int flag; ///flag等于1时,代表它时长方形左边,flag=-1时,代表他是长方形右边。}line[4*maxn];struct NODE ///线段树节点类型{ LL x; ///更新到过该节点的线对应的x(横坐标的值) LL left,right; ///左边界,右边界 bool sign; ///用来标记该节点是否叶子节点 int cover; ///覆盖值}node[maxn<<3];bool cmp(struct Line L1,struct Line L2){ return L1.x<L2.x;}/**构建线段树*/void Build(int rt,int l,int r) ///l,r是Y数组的下标{ node[rt].left = Y[l]; node[rt].right = Y[r]; node[rt].x = -1; node[rt].sign = false; ///flase说明这个节点不是叶子节点 node[rt].cover = 0; if(l+1 == r) { node[rt].sign = true; ///叶子节点 return; } int mid = (l+r)>>1; Build(rt<<1,l,mid); ///递归构建左子树 Build(rt<<1|1,mid,r); ///递归构建右子树}///参数含义,rt为节点,line_x代表当前线对应的横坐标,l下界,r上界///flag代表当前的线是长方形的左侧的边还是右侧的边LL Calculate(int rt,LL line_x,LL l,LL r,int flag){ if(r<=node[rt].left || l>=node[rt].right) return 0; if(node[rt].sign) ///代表其是叶子节点 { if(node[rt].cover>0) { LL pre = node[rt].x; LL ans = (line_x-pre)*(node[rt].right-node[rt].left); node[rt].x = line_x; node[rt].cover += flag; return ans; } else { node[rt].x = line_x; node[rt].cover += flag; return 0; } } LL ans1 = Calculate(rt<<1,line_x,l,r,flag); LL ans2 = Calculate(rt<<1|1,line_x,l,r,flag); return ans1+ans2;}int main(){ LL a,b,c,d; while(~scanf("%d",&n)) { if(n == 0) ///矩形的个数 { printf("*\n"); break; } int i,j; j = 0; for(i = 0; i < n; i++) { scanf("%lld%lld%lld%lld",&a,&b,&c,&d); ///(a,b)左下角的坐标,(c,d)右上角的坐标 Y[j] = b; line[j].x = a; ///长方形左侧的边 line[j].y1 = b; line[j].y2 = d; line[j].flag = 1; j++; Y[j] = d; line[j].x = c; line[j].y1 = b; line[j].y2 = d; line[j].flag = -1; j++; } sort(Y,Y+j); sort(line,line+j,cmp); Build(1,0,j-1); LL union_area = 0; for(i = 0; i < j; i++) { union_area += Calculate(1,line[i].x,line[i].y1,line[i].y2,line[i].flag); } printf("%lld\n",union_area); } return 0;}
阅读全文
0 0
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 F. Overlapping Rectangles(扫描线)
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛: F. Overlapping Rectangles(线段树)
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 F. Overlapping Rectangles(面积并)
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 Overlapping Rectangles
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 F. Overlapping Rectangles
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 F. Overlapping Rectangles
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 Overlapping Rectangles
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛:Overlapping Rectangles
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 F.Overlapping Rectangles
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 F. Overlapping Rectangles (面积并+线段树)
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 F题 Overlapping Rectangles(线段树)
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 B. Train Seats Reservation 和 F. Overlapping Rectangles
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛
- ACM 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 B. Train Seats Reservation
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 B.Train Seats Reservation(模拟)
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 A. Weather Patterns(阅读题)
- LeetCode48_Rotate Image
- 音频FAAC开源编码库调用
- Java学习笔记(23)--foreach 使用
- Android瀑布流照片墙实现,体验不规则排列的美感
- 安卓文件下载之断点续传(一)
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛:Overlapping Rectangles
- Linux创建,删除用户,修改用户组
- BZOJ 3531 [Sdoi2014]旅行 树链剖分 线段树
- maven配置阿里云镜像
- Android多点触控技术实战,自由地对图片进行缩放和移动
- 持久层框架的关注点
- 快速生成mif文件
- 数据结构(三)--循环队列
- 0925 视图、游标、包、触发器、索引