版权声明:欢迎关注我的博客。本文为博主【炒饭君】原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349

Problem A : Counting Squares

From:HDU, 1264

Problem Description
Your input is a series of rectangles, one per line. Each rectangle is specified as two points(X,Y) that specify the opposite corners of a rectangle. All coordinates will be integers in the range 0 to 100. For example, the line
5 8 7 10
specifies the rectangle who's corners are(5,8),(7,8),(7,10),(5,10).
If drawn on graph paper, that rectangle would cover four squares. Your job is to count the number of unit(i.e.,1*1) squares that are covered by any one of the rectangles given as input. Any square covered by more than one rectangle should only be counted once.
Input
The input format is a series of lines, each containing 4 integers. Four -1's are used to separate problems, and four -2's are used to end the last problem. Otherwise, the numbers are the x-ycoordinates of two points that are opposite corners of a rectangle.
Output
Your output should be the number of squares covered by each set of rectangles. Each number should be printed on a separate line.
Sample Input
5 8 7 10 6 9 7 8 6 8 8 11 -1 -1 -1 -1 0 0 100 100 50 75 12 90 39 42 57 73 -2 -2 -2 -2
Sample Output
8 10000
Source
浙江工业大学第四届大学生程序设计竞赛
Recommend
JGShining

题目大意:

给定你一些矩形左下右上角坐标点。或者左上右下坐标点。求这些矩形的面积并。

解题思路:

利用线段树扫描线的知识。此题不须要离散化。

#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;struct node{int x,y1,y2,c;node(int x0=0,int y10=0,int y20=0,int c0=0){x=x0;y1=y10;y2=y20;c=c0;}friend bool operator < (node a,node b){if(a.x!=b.x) return a.x<b.x;else if(a.y1!=b.y1) return a.y1<b.y1;else if(a.y2!=b.y2) return a.y2<b.y2;else return a.c>b.c;}
};const int maxh=110;struct tree{int l,r,c,lz;
}a[maxh*4];vector <node> v;bool input(){int a,b,c,d;v.clear();while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){if(a==-1 && b==-1 && c==-1 && d==-1) return true;if(a==-2 && b==-2 && c==-2 && d==-2) return false;v.push_back(node( min(a,c), min(b,d) , max(b,d) ,1));v.push_back(node( max(a,c), min(b,d) , max(b,d) ,-1));}
}void build(int l,int r,int k){a[k].l=l;a[k].r=r;a[k].c=0;a[k].lz=0;if(l+1<r){int mid=(l+r)/2;build(l,mid,2*k);build(mid,r,2*k+1);}
}void pushdown(int k){if(a[k].lz!=0 && a[k].l+1<a[k].r ){a[2*k].lz+=a[k].lz;a[2*k+1].lz+=a[k].lz;a[2*k].c+=a[k].lz;a[2*k+1].c+=a[k].lz;a[k].lz=0;}
}void insert(int l,int r,int k,int c){if(l<=a[k].l && a[k].r<=r){a[k].lz+=c;a[k].c+=c;}else{pushdown(k);int mid=(a[k].l+a[k].r)/2;if(r<=mid) insert(l,r,2*k,c);else if(l>=mid) insert(l,r,2*k+1,c);else{insert(l,mid,2*k,c);insert(mid,r,2*k+1,c);}}
}int query(int l,int r,int k){pushdown(k);if(l<=a[k].l  && a[k].r<=r){if(a[k].c>0) return r-l;else{if(a[k].l+1==a[k].r) return 0;else {int mid=(a[k].l+a[k].r)/2;return query(l,mid,2*k) + query(mid,r,2*k+1) ;}}}else{int mid=(a[k].l+a[k].r)/2;if(r<=mid) return query(l,r,2*k);else if(l>=mid) return query(l,r,2*k+1);else{return query(l,mid,2*k) + query(mid,r,2*k+1) ;}}
}void solve(){build(0,maxh,1);sort(v.begin(),v.end());insert(v[0].y1,v[0].y2,1,v[0].c);int ans=0;for(int i=1;i<v.size();i++){//cout<<v[i].x-v[i-1].x<<" "<<query(0,maxh,1)<<endl;ans+=(v[i].x-v[i-1].x)*query(0,maxh,1);insert(v[i].y1,v[i].y2,1,v[i].c);}cout<<ans<<endl;
}int main(){while(input()){solve();}solve();return 0;
}


转载于:https://www.cnblogs.com/xfgnongmin/p/10659602.html

HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)相关推荐

  1. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  2. 线段树求矩形面积并 扫描线+离散化

    顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中,这根线很重要.方向的话,可以左右扫,也可以上下扫.方法是一样的,这里我用的是由下向上的扫描法. 如上图所示,坐标系内有两个矩形.位置 ...

  3. ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)

    ZOJ 3597 题意是说有n把枪,有m个靶子,每把枪只有一发子弹(也就是说一把枪最多只能打一个靶子), 告诉你第 i 把枪可以打到第j个靶, 现在等概率的出现一个连续的P把枪,在知道这P把枪之后,你 ...

  4. hdu 1542 Atlantis (线段树+扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...

  5. 线段树扫描线求矩形周长详解

    线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...

  6. hdu1542 线段树扫描线求矩形面积的并

    题意:       给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路:       自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...

  7. hdu3255 线段树扫描线求体积

    题意:       给你n个矩形,每个矩形上都有一个权值(该矩形单位面积的价值),矩形之间可能重叠,重叠部分的权值按照最大的算,最后问这n个矩形组成的图形的最大价值. 思路:       线段树扫描线 ...

  8. bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线(线段树扫描线)

    1645: [Usaco2007 Open]City Horizon 城市地平线 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 732  Solved: ...

  9. 亚特兰蒂斯【线段树+扫描线+离散化】

    亚特兰蒂斯[线段树+扫描线+离散化] POJ1151.ACwing247 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包括岛屿部分地图. 但不幸的是,这些地图描述了亚特 ...

最新文章

  1. spring的依赖注入方式详解
  2. WebService就是这么简单
  3. windows tasklist 查看应用、进程
  4. Tomcat启动阻塞变慢
  5. 如何将内核静态库编译连接到驱动程序中去【转】
  6. Mysql的安装与远程登录
  7. jolokia_Hawtio和Jolokia的Hibernate统计
  8. 透明大页相关内核参数_透明大内存页Hugepage支持
  9. 【白皮书分享】2021智慧零售私域白皮书-腾讯.pdf(附下载链接)
  10. 用标号跳出当前多重嵌套循环是否继续执行循环_在Java中如何跳出当前的多重嵌套循环?...
  11. systemd(CentOS7)启动zookeeper
  12. 软件测试基础知识整理(详细版)
  13. Linux虚拟网络设备之bridge(桥)
  14. easyExcel导出下拉选择框,多sheet数据excle导入导出
  15. selenium 浏览器打开新标签页
  16. Android---性能优化方案分享,高级android开发强化实战pdf
  17. 起底野蛮成长的腾讯共享wifi赚钱小程序,到底是机遇还是陷阱?
  18. 【阅读笔记】Cost Volume Pyramid Based Depth Inference for Multi-View Stereo
  19. 有关图像生成的函数 .
  20. 普通程序员,如何转为当前紧缺的大数据相关人才?

热门文章

  1. 力扣 二叉搜索树的最小绝对差
  2. 每月拿几百元来买基金,有意义吗?
  3. 幼儿园的孩子怎么才可以锻炼其自理能力呢?
  4. 孙子和外孙就是不一样吗?
  5. 当大家都不理解你的时候,就是你成就的捷径
  6. 高人,不断地在营销, 有收入就是高人
  7. 想要获得别人尊重,你必须得自己先牛逼起来
  8. 什么样的老板不适合找运营?
  9. 怎样知道别人在蹭我家wifi?
  10. Qt4_快速设计对话框