HDU1255 扫描线 矩形交面积 离散化
覆盖的面积
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5595 Accepted Submission(s): 2810
注意:本题的输入数据较多,推荐使用scanf读入数据.
题意:
给出矩形左下和右上角的坐标,求矩形交的面积。
代码:
- //cnt[rt]>=2的一定是覆盖过两次以上的,直接计算。cnt[rt]==1时,如果rt的左右儿子
- //被覆盖过大于等于1次,那么再被他们父亲覆盖上就是覆盖过两次了,值是左右儿子被
- //覆盖过一次的长度的和。cnt[rt]==0照常更新。sum2记录覆盖过两次以上的边的长度。
- //sum1记录覆盖过一次的边的长度。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int maxn=;
- double sum1[maxn*],sum2[maxn*],mp[maxn];
- int cnt[maxn*];
- struct node{
- double l,r,h;
- int d;
- node(){}
- node(double a,double b,double c,int d):l(a),r(b),h(c),d(d){}
- bool operator < (const node &p)const{
- if(h==p.h) return d>p.d;
- return h<p.h;
- }
- }nodes[maxn*];
- int Bsearch(double a,int b,double *c)
- {
- int l=,r=b-,mid;
- while(l<=r){
- mid=(l+r)>>;
- if(c[mid]==a) return mid;
- else if(c[mid]>a) r=mid-;
- else l=mid+;
- }
- return -;
- }
- void Pushup(int l,int r,int rt)
- {
- if(cnt[rt]){
- sum1[rt]=mp[r+]-mp[l];
- if(cnt[rt]==)
- sum2[rt]=sum1[rt<<]+sum1[rt<<|];
- else sum2[rt]=mp[r+]-mp[l];
- }
- else if(l==r) sum1[rt]=sum2[rt]=;
- else{
- sum1[rt]=sum1[rt<<]+sum1[rt<<|];
- sum2[rt]=sum2[rt<<]+sum2[rt<<|];
- }
- }
- void Update(int ql,int qr,int v,int l,int r,int rt)
- {
- if(ql<=l&&qr>=r){
- cnt[rt]+=v;
- Pushup(l,r,rt);
- return;
- }
- //if(l==r) return;
- int m=(l+r)>>;
- if(ql<=m) Update(ql,qr,v,l,m,rt<<);
- if(qr>m) Update(ql,qr,v,m+,r,rt<<|);
- Pushup(l,r,rt);
- }
- int main()
- {
- int t,n;
- scanf("%d",&t);
- while(t--){
- scanf("%d",&n);
- int m=,nu=;
- double x1,y1,x2,y2;
- memset(sum1,,sizeof(sum1));
- memset(sum2,,sizeof(sum2));
- memset(cnt,,sizeof(cnt));
- for(int i=;i<n;i++){
- scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
- nodes[m++]=node(x1,x2,y1,);
- nodes[m++]=node(x1,x2,y2,-);
- mp[nu++]=x1;mp[nu++]=x2;
- }
- sort(mp,mp+nu);
- nu=unique(mp,mp+nu)-mp;
- sort(nodes,nodes+m);
- double ans=;
- for(int i=;i<m-;i++){
- int lef=Bsearch(nodes[i].l,nu,mp);
- int rig=Bsearch(nodes[i].r,nu,mp)-;
- if(lef<=rig)
- Update(lef,rig,nodes[i].d,,nu-,);
- ans+=sum2[]*(nodes[i+].h-nodes[i].h);
- }
- printf("%.2lf\n",ans);
- }
- return ;
- }
HDU1255 扫描线 矩形交面积 离散化的更多相关文章
- HDU1255 覆盖的面积 —— 求矩形交面积 线段树 + 扫描线 + 离散化
题目链接:https://vjudge.net/problem/HDU-1255 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<= ...
- hdu 1255 覆盖的面积 (扫描线求矩形交)
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...
- poj 3277 City Horizon (线段树 扫描线 矩形面积并)
题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...
- CCF 201312-3 最大的矩形 (暴力,离散化)
问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3 ...
- HDU 5130 Signal Interference --计算几何,多边形与圆的交面积
题意: 求所有满足PB <= k*PA 的P所在区域与多边形的交面积. 解法: 2014广州赛区的银牌题,当时竟然没发现是圆,然后就没做出来,然后就gg了. 圆的一般式方程: 设A(x1,y1) ...
- Open-air shopping malls(二分半径,两元交面积)
http://acm.hdu.edu.cn/showproblem.php?pid=3264 Open-air shopping malls Time Limit: 2000/1000 MS (Jav ...
- TZOJ 2392 Bounding box(正n边形三点求最小矩形覆盖面积)
描述 The Archeologists of the Current Millenium (ACM) now and then discover ancient artifacts located ...
- hdu 1828 Picture(线段树扫描线矩形周长并)
线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...
随机推荐
- JavaScript 正则
元字符 预定义类 边界 ^在中括号中时,匹配非hello的 str = 'hello world' str.match(/[^hello]/g) //[" ", "w&q ...
- 水管工游戏:dfs(递归)
添柴网这题好想不能评测,所以不确保代码的正确性 题目描述: 这小节有点难,看不太懂可以跳过哦.最近小哼又迷上一个叫做水管工的游戏.游戏的大致规则是这样的.一块矩形土地被分为N * M的单位正方形,现在 ...
- java DTO 转 POJO
如果这两个类的要转化的属性其属性名不一样的话,那只能用get和set方法赋值 如果你的两个类要转化的属性名都一样,那可以用org.springframework.beans.BeanUtils这个类来 ...
- Struts2文件上传带进度条,虽然不是很完美
好久没有写东西,最近在做个项目,要用到文件h 传的,以前虽然也做上传,但是总觉得不好用 ,现在和队友合作做了一个带进度条的上传,觉得还行~~和大家分享一下. 首先说一下大概是这样实现的,在我们平时的上 ...
- 11.24Daily Scrum(4)
人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.1007 实现视频浏览的功能 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.1008 实现视频浏 ...
- 第十八次ScrumMeeting会议
第十八次Scrum Meeting 时间:2017/12/8 地点:线上+SPR咖啡馆 人员:蔡帜 王子铭 游心 解小锐 王辰昱 李金奇 杨森 陈鑫 赵晓宇 照片: 目前工作进展 名字 今日 明天的工 ...
- JavaScript初探系列之数组的基本操作
在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,JavaScript中数组十分灵活.强大,不像是Java等强类型高级语言数组只 ...
- CSS基础小记
2017/10/29 CSS 认识CSS样式 CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏览器内的显示样式,如文字 ...
- 【IdentityServer4文档】- 欢迎来到 IdentityServer4
欢迎来到 IdentityServer4 IdentityServer4 是一款包含和实现了 OpenID Connect 和 OAuth 2.0 协议的,适用于 ASP.NET Core 的框架 . ...
- Java中的死锁问题
死锁问题: 例如有两个线程, 线程1与线程2. 线程1在执行的过程中, 要锁定对象1, 2才能完成整个操作, 首先锁定对象1, 再锁定对象2. 线程2在执行的过程中, 要锁定对象2, 1才能完成整个操 ...