当前位置: 首页 > news >正文

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

题目地址: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;
        }
        else
            sum[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;
        else
            low=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;
}


转载于:https://www.cnblogs.com/yutingliuyl/p/6866054.html

相关文章:

  • cocos2d-x lua 中使用protobuf并对http进行处理
  • SSH防暴力破解的解决方法
  • 第三篇:一个Spark推荐系统引擎的实现
  • 2017 计蒜之道 初赛 第一场 B.阿里天池的新任务
  • C# WebApi 返回JSON
  • 可执行文件的装载
  • 自己定义控件 播放GIF动画
  • WEB服务器-Nginx之虚拟主机、日志、认证及优化
  • day06 tar命令使用,vim简单操作以及linux开机过程
  • 面面观 | 使用dokcer 构建 mariadb 数据库
  • 3 个在 Linux 中永久并安全删除文件和目录的方法
  • 再会Java
  • 自动化运维工具SaltStack详细部署
  • PHP MySQL
  • 算法之选择排序算法
  • [NodeJS] 关于Buffer
  • [数据结构]链表的实现在PHP中
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 2017年终总结、随想
  • Android组件 - 收藏集 - 掘金
  • HTTP中GET与POST的区别 99%的错误认识
  • mac修复ab及siege安装
  • MQ框架的比较
  • Redash本地开发环境搭建
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • supervisor 永不挂掉的进程 安装以及使用
  • Swift 中的尾递归和蹦床
  • 初识 beanstalkd
  • 大主子表关联的性能优化方法
  • 第十八天-企业应用架构模式-基本模式
  • - 概述 - 《设计模式(极简c++版)》
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • ------- 计算机网络基础
  • 爬虫模拟登陆 SegmentFault
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 跳前端坑前,先看看这个!!
  • 学习笔记TF060:图像语音结合,看图说话
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (4)logging(日志模块)
  • (5)STL算法之复制
  • (6)设计一个TimeMap
  • (ibm)Java 语言的 XPath API
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (solr系列:一)使用tomcat部署solr服务
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (算法二)滑动窗口
  • (转)用.Net的File控件上传文件的解决方案
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net