HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
Problem A : Counting Squares
From:HDU, 1264
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.
题目大意:
给定你一些矩形左下右上角坐标点。或者左上右下坐标点。求这些矩形的面积并。
解题思路:
利用线段树扫描线的知识。此题不须要离散化。
#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 (线段树-扫描线-矩形面积并)相关推荐
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- 线段树求矩形面积并 扫描线+离散化
顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中,这根线很重要.方向的话,可以左右扫,也可以上下扫.方法是一样的,这里我用的是由下向上的扫描法. 如上图所示,坐标系内有两个矩形.位置 ...
- ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)
ZOJ 3597 题意是说有n把枪,有m个靶子,每把枪只有一发子弹(也就是说一把枪最多只能打一个靶子), 告诉你第 i 把枪可以打到第j个靶, 现在等概率的出现一个连续的P把枪,在知道这P把枪之后,你 ...
- hdu 1542 Atlantis (线段树+扫描线)
http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...
- 线段树扫描线求矩形周长详解
线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- hdu3255 线段树扫描线求体积
题意: 给你n个矩形,每个矩形上都有一个权值(该矩形单位面积的价值),矩形之间可能重叠,重叠部分的权值按照最大的算,最后问这n个矩形组成的图形的最大价值. 思路: 线段树扫描线 ...
- bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线(线段树扫描线)
1645: [Usaco2007 Open]City Horizon 城市地平线 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 732 Solved: ...
- 亚特兰蒂斯【线段树+扫描线+离散化】
亚特兰蒂斯[线段树+扫描线+离散化] POJ1151.ACwing247 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包括岛屿部分地图. 但不幸的是,这些地图描述了亚特 ...
最新文章
- spring的依赖注入方式详解
- WebService就是这么简单
- windows tasklist 查看应用、进程
- Tomcat启动阻塞变慢
- 如何将内核静态库编译连接到驱动程序中去【转】
- Mysql的安装与远程登录
- jolokia_Hawtio和Jolokia的Hibernate统计
- 透明大页相关内核参数_透明大内存页Hugepage支持
- 【白皮书分享】2021智慧零售私域白皮书-腾讯.pdf(附下载链接)
- 用标号跳出当前多重嵌套循环是否继续执行循环_在Java中如何跳出当前的多重嵌套循环?...
- systemd(CentOS7)启动zookeeper
- 软件测试基础知识整理(详细版)
- Linux虚拟网络设备之bridge(桥)
- easyExcel导出下拉选择框,多sheet数据excle导入导出
- selenium 浏览器打开新标签页
- Android---性能优化方案分享,高级android开发强化实战pdf
- 起底野蛮成长的腾讯共享wifi赚钱小程序,到底是机遇还是陷阱?
- 【阅读笔记】Cost Volume Pyramid Based Depth Inference for Multi-View Stereo
- 有关图像生成的函数 .
- 普通程序员,如何转为当前紧缺的大数据相关人才?