HDU 1255 覆盖的面积
来源:互联网 发布:使用js对url进行编码 编辑:程序博客网 时间:2024/05/04 22:39
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255
题意:给出n个矩形求重叠的面积
思路:将扫描线的有有效长度设置为要被覆盖2次以上的区域,覆盖2次的区域可以通过覆盖一次的区域求出来比较巧妙,详细看getlen函数就好,在做过普通扫描线的题目基础上很好理解
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define maxn 100030using namespace std;struct Tree{ int l,r; double tsum,msum;}tree[maxn*3];struct Node{ int date; double l,r,h;}s[maxn];int lazy[maxn*3],cnt;double pos[maxn];bool cmp(Node p,Node q){ return p.h<q.h;}void getlen(int root){ if (lazy[root]>0) tree[root].tsum=pos[tree[root].r+1]-pos[tree[root].l]; else if (tree[root].l==tree[root].r) tree[root].tsum=0; else tree[root].tsum=tree[root<<1].tsum+tree[root<<1|1].tsum; if (lazy[root]>1) tree[root].msum=pos[tree[root].r+1]-pos[tree[root].l]; else if (tree[root].l==tree[root].r) tree[root].msum=0; else if (lazy[root]==1) tree[root].msum=tree[root<<1].tsum+tree[root<<1|1].tsum; else tree[root].msum=tree[root<<1].msum+tree[root<<1|1].msum;}void build(int root,int l,int r){ tree[root].l=l; tree[root].r=r; tree[root].tsum=0; tree[root].msum=0; if (l==r) return; int mid=(l+r)>>1; build(root<<1,l,mid); build(root<<1|1,mid+1,r);}void update(int root,int l,int r,int val){ if (tree[root].l>=l && tree[root].r<=r) { lazy[root]+=val; getlen(root); return; } int mid=(tree[root].l+tree[root].r)>>1; if (l<=mid) update(root<<1,l,r,val); if (r>mid) update(root<<1|1,l,r,val); getlen(root);}void getpoint(double x1,double x2,double h,int date){ s[cnt].l=x1; s[cnt].r=x2; s[cnt].h=h; s[cnt].date=date; cnt++;}int main(){ int t,n; scanf("%d",&t); while (t--) { cnt=0; int num=0; memset(lazy,0,sizeof(lazy)); scanf("%d",&n); for (int i=0;i<n;i++) { double x1,x2,y1,y2; scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); getpoint(x1,x2,y1,1); getpoint(x1,x2,y2,-1); pos[num++]=x1; pos[num++]=x2; } sort(pos,pos+num); sort(s,s+cnt,cmp); int tem=1; for (int i=1;i<num;i++) { if (pos[i]!=pos[i-1]){ pos[tem++]=pos[i];//cout<<":"<<pos[tem]<<endl; } } build(1,0,tem); double res=0; for (int i=0;i<cnt-1;i++) { int l=lower_bound(pos,pos+tem,s[i].l)-pos; int r=lower_bound(pos,pos+tem,s[i].r)-pos-1;// update(1,l,r,s[i].date);//cout<<":"<<tree[1].msum<<endl; res+=tree[1].msum*(s[i+1].h-s[i].h); } printf("%.2f\n",res); }}
0 0
- hdu 1255 覆盖的面积
- hdu 1255 覆盖的面积
- hdu 1255 覆盖的面积
- HDU 1255 覆盖的面积
- HDU-1255-覆盖的面积
- hdu 1255 覆盖的面积
- Hdu 1255 覆盖的面积
- HDU 1255 覆盖的面积
- hdu 1255 覆盖的面积
- HDU 1255 覆盖的面积
- HDU 1255 覆盖的面积
- HDU 1255 覆盖的面积
- HDU 1255 覆盖的面积
- hdu 1255 覆盖的面积
- hdu 1255 覆盖的面积
- hdu 1255 覆盖的面积(矩形面积并,多次覆盖)
- 覆盖的面积 HDU
- 覆盖的面积 HDU
- 巧用GestureDetector滑动页面
- nginx架构与实现
- 一个API接口的例子,包括单元测试
- Linux命令备忘实例(6)——排序和基本统计命令
- Java中的HashCode
- HDU 1255 覆盖的面积
- 程序员面试题集锦
- 图片自动播放(用UIScrollView和NSTimer)时定时器的开启和关闭
- Shell之-备份系统重要文件
- POJ 2976 Dropping tests(最大化平均值)
- ArrayList类是一个特殊的数组
- 计算机网络各层协议【转载】
- IOS KVC
- centos常用指令之用户和权限