博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu1255 覆盖面积
阅读量:4886 次
发布时间:2019-06-11

本文共 1440 字,大约阅读时间需要 4 分钟。

题意:求N个矩形中,求被覆盖至少俩次的面积和

分析:一开始以为用总面积减去面积并就可以了,可是想了想,当面积被覆盖了俩次以上,就漏减 了,所以只能老老实实算了。

具体方法跟求面积并十分类似,求面积并时,排完序之后,每次插入一条线段之后,求出整个区间当前被覆盖的总长度再乘以 前后俩条线段的水平距离;

而这道题目,每次插入一条线段之后,求整个区间当前被覆盖至少俩次的总长度再乘以水平距离,;

要求整个区间被覆盖至少俩次的总长度,只需在原有代码上添加几个更新而已,具体代码附了解释

#include
#include
#define maxn 2222using namespace std;struct node{ double x,y1,y2; int s; node(double a=0,double b=0,double c=0,int d=0):x(a),y1(b),y2(c),s(d){} friend bool operator<(const node a,const node b) { return a.x
=2)//若被覆盖了俩次以上,则inlen[k]等于区间长度 inlen[k]=map1[t+1]-map1[s]; else if(t==s)//叶节点,等于零 inlen[k]=0; else if(cnt[k]==1)//若该区间整体被覆盖过一次,则inlen[k]等于子区间被覆盖过一次的线段长度之和 inlen[k]=len[k<<1]+len[k<<1|1]; else inlen[k]=inlen[k<<1]+inlen[k<<1 |1];//若整体没被标记过,则inlen[k]等于子区间被覆盖过俩次的线段长度之和}void update(int l,int r,int c,int s,int t,int k){ if(l<=s && t<=r) { cnt[k]+=c; PushUp(k,s,t); inPushUp(k,s,t); return ; } int kl=k<<1,kr=kl+1,mid=(s+t)>>1; if(l<=mid) update(l,r,c,s,mid,kl); if(r>mid) update(l,r,c,mid+1,t,kr); PushUp(k,s,t); inPushUp(k,s,t);}int Bin(double key,int n,double map1[]) { int l = 0 , r = n - 1; while (l <= r) { int mid = (l + r) >> 1; if (map1[mid] == key) return mid; if (map1[mid] < key) l = mid + 1; else r = mid - 1; } return -1;}int main(){ double a,b,c,d; int n,T; scanf("%d",&T); while(T--) { scanf("%d",&n); int m=0; for(int i=0;i

转载于:https://www.cnblogs.com/nanke/archive/2011/10/02/2198255.html

你可能感兴趣的文章
自动编号维护SNRO
查看>>
将支付宝发来的数据生成有序数列
查看>>
事后诸葛亮
查看>>
ubuntu16.04下安装mysql详细步骤
查看>>
教练技术的小应用
查看>>
关于手机音乐软件问卷调查的分析报告
查看>>
pat02-线性结构2. 一元多项式求导 (25)
查看>>
Leetcode 28. Implement strStr()
查看>>
python中的ConfigParser模块
查看>>
IOS多线程 总结 -------------核心代码(GCD)
查看>>
图片上传iOS
查看>>
Spring、Spring MVC、MyBatis整合文件配置详解
查看>>
Python3之random模块
查看>>
JAVA基础经典面试
查看>>
git 和 github 学习总结
查看>>
AWS MVC 详解
查看>>
zookeeper[4] 安装windows zookeeper,及问题处理
查看>>
C# 0、1 状态转换(int 类型转string 类型的方法)
查看>>
基于.NET Framework 的Windows应用程序如何回收内存
查看>>
codeforce 600A - Extract Numbers
查看>>