题目地址:HDU 1255

这题跟面积并的方法非常像,仅仅只是须要再加一个变量。

刚開始我以为直接用那个变量即可,仅仅只是推断是否大于0改成推断是否大于1。可是后来发现了个问题,由于这个没有下放,没延迟,比方,在父节点上加了一次1,在该父节点的子节点上又加了一次1,可是这时候全部的结点仍然没有达到2的,可是实际上子节点已经达到2了。这时候能够再加一个变量。那个变量用来保存覆盖数大于等于0的情况。这种话当计算大于1的覆盖节点的时候,当推断为1的时候就要加上子节点的全部情况,由于字节点是大于0的,加上子节点的说明该父节点也是大于1的。

代码例如以下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>using namespace std;
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1
int lazy[10000], cnt;
double sum[10000], c[10000], once[10000];
struct node
{double l, r, h;int f;
} edge[100000];
int cmp(node x, node y)
{return x.h<y.h;
}
void add(double l, double r, double h, int f)
{edge[cnt].l=l;edge[cnt].r=r;edge[cnt].h=h;edge[cnt++].f=f;
}
void PushUp(int l, int r, int rt)
{if(lazy[rt]>=2){once[rt]=sum[rt]=c[r+1]-c[l];}else if(lazy[rt]==1){once[rt]=c[r+1]-c[l];if(l==r){sum[rt]=0;}elsesum[rt]=once[rt<<1]+once[rt<<1|1];}else{if(l==r)once[rt]=sum[rt]=0;else{once[rt]=once[rt<<1]+once[rt<<1|1];sum[rt]=sum[rt<<1]+sum[rt<<1|1];}}
}
void update(int ll, int rr, int x, int l, int r,int rt)
{if(ll<=l&&rr>=r){lazy[rt]+=x;PushUp(l,r,rt);return ;}int mid=l+r>>1;if(ll<=mid) update(ll,rr,x,lson);if(rr>mid) update(ll,rr,x,rson);PushUp(l,r,rt);
}
int erfen(double x, int high)
{int low=0, mid;while(low<=high){mid=low+high>>1;if(c[mid]==x)return mid;else if(c[mid]>x)high=mid-1;elselow=mid+1;}
}
int main()
{int t, n, i, j, k;double x1, x2, y1, y2, ans;scanf("%d",&t);while(t--){ans=0;memset(sum,0,sizeof(sum));memset(lazy,0,sizeof(lazy));memset(once,0,sizeof(once));scanf("%d",&n);k=0;cnt=0;for(i=0; i<n; i++){scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);c[k++]=x1;c[k++]=x2;add(x1,x2,y1,1);add(x1,x2,y2,-1);}sort(edge,edge+2*n,cmp);sort(c,c+k);for(i=0; i<2*n-1; i++){int l=erfen(edge[i].l,2*n-1);int r=erfen(edge[i].r,2*n-1);//printf("%d %d\n",l,r);update(l,r-1,edge[i].f,0,2*n-1,1);ans+=sum[1]*(edge[i+1].h-edge[i].h);//printf("%.2lf   %.2lf\n",sum[1],edge[i+1].h-edge[i].h);}printf("%.2lf\n",ans);}return 0;
}

HDU 1255 覆盖的面积(线段树+扫描线)相关推荐

  1. HDU - 1255 覆盖的面积(线段树+扫描线)

    题目链接:点击查看 题目大意:中文题面,简单明了,不多赘述 题目分析:这个题可以理解为Atlantis的升级版,其实完全可以对Atlantis这道题目的代码稍加修改就可以交上这个题,关键是如何修改?一 ...

  2. HDU1255 覆盖的面积 (线段树 + 扫描线)

    题目链接:覆盖的面积 大致题意 现在有平面直角坐标系xoy, 有n个平行于x轴y轴的矩形, 给出这些矩形的左上角和右下角的坐标, 让你求出这些矩形组成的图形中被至少两个矩形覆盖的部分的总面积. 解题思 ...

  3. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  4. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

  5. hdu 1255 覆盖的面积 (扫描线求矩形交)

    覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  6. hdu 1255 覆盖的面积

    覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  7. hdu 1255 覆盖的面积 (Bruceforce)

    Problem - 1255 暴力统计覆盖超过一次的区域.1y. 代码如下: 1 #include <cstdio> 2 #include <cstring> 3 #inclu ...

  8. hdu 1542 Atlantis (线段树+扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...

  9. hdu1542 线段树扫描线求矩形面积的并

    题意:       给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路:       自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...

最新文章

  1. $(function(){})、$(document).ready(function(){})....../ ready和onload的区别
  2. SSH,SCP,SFTP命令汇总
  3. Linux系统命令三剑客之 awk
  4. BZOJ.3277.串(广义后缀自动机)
  5. 【JAVA基础篇】注解
  6. java mac pos_pos终端mac国密(sm4)算法(java实现)
  7. 曾陷“数据风暴”危机的赛默飞世尔如何化险为夷的?
  8. 第二:Java+MyBatis(深入学习)
  9. TeamViewer运行在Windows Server 2008下连接时错误提示:正在初始化显示参数
  10. paip.软件版本完善计划VC421
  11. 专利服务器拒收 文件异常解压,电子申请专利常见错误总结.pdf
  12. 2020年终系列:国内区块链专利授权总数不足3000项|链塔智库
  13. 转:Nutch学习笔记--抓取过程简析
  14. docker安装shipyard
  15. 餐厅小票打印模板_智慧餐厅多商家入驻小程序开发,成功案例:万足外卖!
  16. android 开源 高斯模糊_Android高斯模糊你所不知道的坑
  17. 3ds Max 2014以及低版本在高分辨率带DPI缩放设置的应用程序设置
  18. Redis教程(一) Redis入门教程
  19. python3中flask下载文件:图像.jpg
  20. 知识图谱入门 (一) 知识图谱与语义技术概览

热门文章

  1. Qt设计器中,使用QToolBar控件的技巧
  2. 【STM32 .Net MF开发板学习-28】中文显示(WPF方式)
  3. 这个 DNS 新漏洞可导致大规模的 DDoS 攻击活动
  4. 训练的时候 nvidia:自动刷新
  5. 面向对象的设计模式(七),观察者模式
  6. CentOS 上snmp的安装和配置
  7. Android Studio 使用 Gradle 打包 Jar
  8. 使用js获取select选中文本
  9. Software Marketing
  10. Ubuntu16.04安装最新版nodejs