HDU-1255 覆盖的面积 (扫描线)
题目大意:给若干个矩形,统计重叠次数不为0的面积。
题目分析:维护扫描线的长度时,只需要只统计覆盖次数大于1的区间即可。这是个区间更新,不过不能使用懒标记,但是数据规模不大,不用懒惰标记仍可以AC。
代码如下:
- # include<iostream>
- # include<cstdio>
- # include<map>
- # include<vector>
- # include<cstring>
- # include<algorithm>
- using namespace std;
- # define mid (l+(r-l)/2)
- const int N=1000;
- void read(int &x)
- {
- x=0;
- char c;
- while((c=getchar())&&(c<'0'||c>'9'));
- x=c-'0';
- while(c=getchar()){
- if(c<'0'||c>'9') break;
- x=x*10+c-'0';
- }
- }
- //*****************************************
- struct Node
- {
- int c;
- double len;
- };
- struct Segment
- {
- double x1,x2,y;
- int d;
- };
- Segment seg[N*2+5];
- map<double,int>mp;
- vector<double>v;
- Node tr[(N<<3)+5];
- bool comp(const Segment &s1,const Segment &s2)
- {
- return s1.y<s2.y;
- }
- void pushUp(int rt)
- {
- tr[rt].len=tr[rt<<1].len+tr[rt<<1|1].len;
- }
- void build(int rt,int l,int r)
- {
- tr[rt].c=0;
- tr[rt].len=0.0;
- if(l==r) return ;
- build(rt<<1,l,mid);
- build(rt<<1|1,mid+1,r);
- }
- void update(int rt,int l,int r,int L,int R,int d)
- {
- if(l==r){
- tr[rt].c+=d;
- if(tr[rt].c>1) tr[rt].len=v[r]-v[l-1];
- else tr[rt].len=0;
- }else{
- if(L<=mid) update(rt<<1,l,mid,L,R,d);
- if(R>mid) update(rt<<1|1,mid+1,r,L,R,d);
- pushUp(rt);
- }
- }
- int main()
- {
- //freopen("in.txt","r",stdin);
- int T,n;
- read(T);
- while(T--)
- {
- read(n);
- v.clear();
- mp.clear();
- double x1,x2,y1,y2;
- for(int i=0;i<n;++i){
- scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
- seg[i<<1].x1=seg[i<<1|1].x1=x1;
- seg[i<<1].x2=seg[i<<1|1].x2=x2;
- seg[i<<1].y=y1,seg[i<<1|1].y=y2;
- seg[i<<1].d=1,seg[i<<1|1].d=-1;
- v.push_back(x1);
- v.push_back(x2);
- }
- n<<=1;
- sort(seg,seg+n,comp);
- sort(v.begin(),v.end());
- int m=unique(v.begin(),v.end())-v.begin();
- for(int i=0;i<m;++i) mp[v[i]]=i+1;
- seg[n].y=seg[n-1].y;
- build(1,1,m-1);
- double ans=0.0;
- for(int i=0;i<n;++i){
- update(1,1,m-1,mp[seg[i].x1],mp[seg[i].x2]-1,seg[i].d);
- ans+=tr[1].len*(seg[i+1].y-seg[i].y);
- //cout<<tr[1].len<<endl;
- }
- printf("%.2lf\n",ans);
- }
- return 0;
- }
HDU-1255 覆盖的面积 (扫描线)的更多相关文章
- hdu 1255 覆盖的面积 (扫描线求矩形交)
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU 1255 覆盖的面积 ( 扫描线 + 离散 求矩阵大于k次面积并 )
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- hdu 1255 覆盖的面积(线段树 面积 交) (待整理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. In ...
- hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)
了校赛,还有什么途径可以申请加入ACM校队? 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- hdu 1255 覆盖的面积 (线段树处理面积覆盖问题(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1255 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memo ...
- HDU 1255 覆盖的面积(线段树+扫描线)
题目地址:HDU 1255 这题跟面积并的方法非常像,仅仅只是须要再加一个变量. 刚開始我以为直接用那个变量即可,仅仅只是推断是否大于0改成推断是否大于1.可是后来发现了个问题,由于这个没有下放,没延 ...
- HDU 1255 覆盖的面积(线段树:扫描线求面积并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:给你若干个矩形,让你求这些矩形重叠两次及以上的部分的面积. 解题思路:模板题,跟HDU ...
- HDU 1255 覆盖的面积 (线段树扫描线+面积交)
自己YY了一个的写法,不过时间复杂度太高了,网上的想法太6了 题意:给你一些矩阵,求出矩阵的面积并 首先按照x轴离散化线段到线段树上(因为是找连续区间,所以段建树更加好做). 然后我们可以想一下怎样 ...
- HDU 1255 覆盖的面积 (线段树+扫描线+离散化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题意很清楚,就是让你求矩阵之间叠加层数大于1的矩形块的面积和. 因为n只有1000,所以我离散化 ...
随机推荐
- 傅里叶变换:MP3、JPEG和Siri背后的数学
九年前,当我还坐在学校的物理数学课的课堂里时,我的老师为我们讲授了一种新方法,给我留下了深刻映像.我认为,毫不夸张地说,这是对数学理论发现最广泛的应用.应用的领域包括:量子物理.射电天文学.MP3和J ...
- JVM-对象的存活与死亡
当Java虚拟机进行垃圾收集的时候,那么它必须要先判断对象,是否还存活,如果存活就不能对它进行回收.所以判断一个对象是否存活是Java虚拟机必须要实现的. 1.对象是否存活 1)引用计数器:给对象添加 ...
- Embedded binary is not signed with the same certificate as the parent app
I face the same issue too,I solve it by this: First, I reCreate my team develop certificate(Because ...
- LINQ基础 之 LINQ TO SQL (二)
配置LINQ TO SQL 首先添加一个Linq to sql文件,以.dbml结尾的文件.无法把表拖拽到.dbml文件中,提示“所选对象使用不支持的数据提供程序” 解决方案 在服务器资源管理器中右键 ...
- EF学习笔记(一)
EF(EntityFramwork)实体框架:主要是将实体类(EntityClass)和数据表(Table)进行映射(Map). EF核心对象: DbContext (数据访问核心对象) ...
- LeetCode222 Count Complete Tree Nodes
对于一般的二叉树,统计节点数目遍历一遍就可以了,但是这样时间复杂度O(n),一下就被卡住了. 这题首先要明白的是,我们只需要知道叶子节点的数目就能统计出总节点树. 想法1: 既然是完全二叉树,我肯定是 ...
- GSM cell phone calls use outdated encryption that can now be cracked with rainbow tables on a PC
Decrypting GSM phone calls Motivation. GSM telephony is the world’s most popular communication techn ...
- atomic和nonatomic的区别
1.使用atomic进行修饰的属性,在实现文件中不能重写setter方法和getter方法,不然在编译过程会发生报错. 1.使用nonatomic进行修饰的属性,在实现文件中可以重写setter方法和 ...
- Emacs和Ultra Edit列编辑模式
在emacs中可以使用C-r系列组合键进行区域选择编辑,或者使用emacs自带的cua-mode,然后键入C-ret进行可视化列编辑. 使用Ultra Edit同样可以方便的进入列编辑模式,只需要按下 ...
- HDU 4004
http://acm.hdu.edu.cn/showproblem.php?pid=4004 题意:青蛙过长L的河,只能落在石头上,石头数量是n,给出n个坐标,至多跳m次,求在可以过河的条件下,青蛙跳 ...