hdu 1255 覆盖的面积

2023-11-14

Problem

acm.hdu.edu.cn/showproblem.php?pid=1255

Reference

hdu 1255 覆盖的面积
矩形面积并、矩形面积交、矩形周长并(线段树、扫描线总结)

Meaning

给出 n 个矩形,求它们相交部分的总面积。

Analysis

扫描线求矩形面积交,与求面积并类似。
求面积并时有个 cvr 数组(CoVeR),表示区间被完全覆盖的次数。相交部分,也即被覆盖至少两次。但不能简单就把判断条件从cvr[rt] > 0改成cvr[rt] > 1就结束,因为整个区间没有完全覆盖多于一次,但某些子区间可能有。
算面积并时只要一个数组统计总长,算面积交时要两个:一个和算面积并的那个相同,统计覆盖至少一次的区间总长(one[]);另一个统计覆盖至少两次的区间总长(two[])。
push_up 的时候,分几种情况:

  1. cvr[rt] >= 2:即整个区间都被覆盖至少两次,那么有:one[rt] = two[rt] = x[r] - x[l],直接就是区间的长度;
  2. cvr[rt] == 1:整个区间被完全覆盖 1 次,故one[rt] = x[r] - x[l],而对于two[],可能存在某些子区间覆盖有不止 1 次,所以还要再分情况:
    1. l + 1 >= r:已是最小的区间(没有更小的子区间),那么two[rt] = 0
    2. 否则,two[rt] = one[rt<<1] + one[rt<<1|1],因为本区间已完全覆盖 1 次,子区间只需再覆盖一次,就能满足至少两次
  3. cvr[rt] == 0:区间没有被完全覆盖,还是要看子区间:
    1. l + 1 >= r:有子区间,那么:one[rt] = one[rt<<1] + one[rt<<1|1]two[rt] = two[rt<<1] + two[rt<<1|1]
    2. 否则,one[rt] = two[rt] = 0

Code

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1000;

struct segment
{
    double l, r, h;
    int v;

    segment() {}

    segment(double _l, double _r, double _h, int _v):
        l(_l), r(_r), h(_h), v(_v) {}

    bool operator < (const segment &rhs) const
    {
        return h > rhs.h;
    }
} s[N<<1];

double x[N<<1], one[N<<3], two[N<<3];
int cvr[N<<3];

void pushup(int l, int r, int rt)
{
    if(cvr[rt] > 1) // 区间被完全覆盖超过 1 次
        one[rt] = two[rt] = x[r] - x[l];
    else if(cvr[rt] == 1) // 被完全覆盖只有 1 次
    {
        one[rt] = x[r] - x[l];
        if(l + 1 >= r) // 没有子区间
            two[rt] = 0.0;
        else // 只需子区间再覆盖 1 次
            two[rt] = one[rt<<1] + one[rt<<1|1];
    }
    else if(l + 1 >= r) // 没被完全覆盖过,又没有子区间
        one[rt] = two[rt] = 0.0;
    else // 没被完全覆盖,但有子区间
    {
        one[rt] = one[rt<<1] + one[rt<<1|1];
        two[rt] = two[rt<<1] + two[rt<<1|1];
    }
}

void update(int ul, int ur, int v, int l, int r, int rt)
{
    if(ul <= l && r <= ur)
    {
        cvr[rt] += v;
        pushup(l, r, rt);
        return;
    }
    int m = l + r >> 1;
    if(ul < m)
        update(ul, ur, v, l, m, rt<<1);
    if(ur > m)
        update(ul, ur, v, m, r, rt<<1|1);
    pushup(l, r, rt);
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n;
        scanf("%d", &n);
        for(int i = 0; i < n; ++i)
        {
            double l, r, u, d;
            scanf("%lf%lf%lf%lf", &l, &d, &r, &u);
            s[i] = segment(l, r, u, 1);
            s[i+n] = segment(l, r, d, -1);
            x[i] = l;
            x[i+n] = r;
        }
        n <<= 1;
        sort(x, x + n);
        sort(s, s + n);
        int m = unique(x, x + n) - x;
        memset(cvr, 0, sizeof cvr);
        memset(one, 0, sizeof one);
        memset(two, 0, sizeof two);
        double ans = 0.0;
        for(int i = 0, l, r; i < n - 1; ++i)
        {
            l = lower_bound(x, x + m, s[i].l) - x;
            r = lower_bound(x, x + m, s[i].r) - x;
            update(l, r, s[i].v, 0, m-1, 1);
            ans += two[1] * (s[i].h - s[i+1].h);
        }
        printf("%.2f\n", ans);
    }
    return 0;
}

Post Script

  • 题目说的是“左上、右下”,但其实它给的是“左下、右上”…
  • 这份代码是从上往下扫
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hdu 1255 覆盖的面积 的相关文章

  • hdu 5818 Joint Stacks 2016 Multi-University 7

    Problem acm hdu edu cn showproblem php pid 5818 官方题解 bestcoder hdu edu cn blog 2016 multi university training contest 7
  • hdu 1827 Summer Holiday 强连通分量缩点

    题目 http acm hdu edu cn showproblem php pid 1827 题意 听说lcy帮大家预定了新马泰7日游 Wiskey真是高兴的夜不能寐啊 他想着得快点把这消息告诉大家 虽然他手上有所有人的联系方式 但是一个
  • 牛牛的等差数列【线段树】

    题目链接 这里的突破口在于小于等于25且大于等于3的质数连乘在1e8左右 所以 我们可以在操作上 将其看作对1e8去求模 而不是对每个都进行预处理 时间复杂度 也就是说 我们排除这个预处理之后 直接就是降了10倍左右的复杂度 然后 给区间一
  • 敌兵布阵

    http acm hdu edu cn showproblem php pid 1166 Problem Description C国的死对头A国这段时间正在进行军事演习 所以C国间谍头子Derek和他手下Tidy又开始忙乎了 A国在海岸线
  • 【CSDN竞赛第17期】简要题解 92.5分

    目录 1 判断胜负 简单字符串 题目 题解 比赛时代码 2 买铅笔 简单算数 题目 题解 代码 3 拯救爱情 得分70 题目 题解 比赛时代码 4 拯救公主 中国剩余定理 或 模拟 题目 题解 模拟 中国剩余定理 比赛时代码 1 判断胜负
  • 杭电OJ_(2043)密码

    Problem Description 网上流传一句话 常在网上飘啊 哪能不挨刀啊 其实要想能安安心心地上网其实也不难 学点安全知识就可以 首先 我们就要设置一个安全的密码 那什么样的密码才叫安全的呢 一般来说一个比较安全的密码至少应该满足
  • hdu 4712 Hamming Distance

    Problem acm hdu edu cn showproblem php pid 4712 Reference 多向 bfs 思路 CSDN markdown 用 LaTeX Meaning 定义两个整数数 a 和 b 的汉明距离为 a
  • 2021CCPC河南省赛题解(主席树+二分)

    考场没看见随机化数据 写了一个主席树 二分 但是之前练习的时候没有做过多实例 忘记初始化上层用到的所有节点信息了 wa麻了 思路 主席树 二分 O nlogn 2 二分距离当前点最近的 大于等于a i 的数的个数最靠右的位置 然后利用主席树
  • poj 2155 Matrix

    Problem poj org problem id 2155 vjudge net contest 146952 problem A Referencd www cnblogs com gj Acit p 3258880 html Mea
  • The centre of polygon (多边形重心)

    描述 Given a polygon your task is to find the centre of gravity for the given polygon 输入 The input consists of T test case
  • gym 101505 CTU Open Contest 2016 G Orchard Division

    Problem codeforces com gym 101505 attachments vjudge net contest 187874 problem G Meaning 一个 m m 的网格 长 宽下标 0 m 1 里有 n 个点
  • hduoj 2002

    计算球体积 Problem Description 根据输入的半径值 计算球的体积 Input 输入数据有多组 每组占一行 每行包括一个实数 表示球的半径 Output 输出对应的球的体积 对于每组输入数据 输出一行 计算结果保留三位小数
  • [ACM] 1016 Prime Ring Problem (深度优先搜索)

    Prime Ring Problem Problem Description A ring is compose of n circles as shown in diagram Put natural number 1 2 n into
  • ACM-子串(字符串处理)

    问题描述 有一些由英文字符组成的大小写敏感的字符串 请写一个程序 找到一个最长的字符串 x 使得 对于已经给出的字符串中的任意一个 y x 或者是 y 的子串 或者 x 中的字符反序之后得到的新字符串是 y 的子串 输入数据 输入 输入的第
  • 判断一个点是否在圆内(三点确定一个圆)

    三角形的外接圆圆心是任意两边的垂直平分线的交点 三角形外接圆圆心叫外心
  • hduoj 2010

    水仙花数 Problem Description 春天是鲜花的季节 水仙花就是其中最迷人的代表 数学上有个水仙花数 他是这样定义的 水仙花数 是指一个三位数 它的各位数字的立方和等于其本身 比如 153 1 3 5 3 3 3 现在要求输出
  • Snowy Smile【扫描线】【2019 杭电多校6】

    HDU 6638 题目链接 比赛的时候只在拼命的想怎么去优化O N 3 的那个之前所认为的标准解法 没想到 这就是一道O N 2 logN 的扫描线 我们可以固定上下两个区间 然后在固定的区域中 就是一维的空间了 我们直接在这一维里去查询即
  • 回溯--深度优先搜索(图的M着色问题 poj1129)

    回溯 图的m着色问题 题目描述 给定无向连通图G V E 和m种不同的颜色 用这些颜色为图G的各顶点着色 每个顶点着一种颜色 是否有一种着色法使G中相邻的两个顶点有不同的颜色 这个问题是图的m可着色判定问题 若一个图最少需要m种颜色才能使图
  • hdu 3966 Aragorn's Story

    Problem acm hdu edu cn showproblem php pid 3966 Reference 树链剖分 树链剖分原理 树链剖分详解及模板 HDU3966 树链剖分 Meaning 一棵 n 个点的树 每给结点有个值 三
  • Atlantis 【POJ - 1151】【扫描线模板题+线段树更新】

    题目链接 是一道扫描线的模板题 也是我的第一道扫描线的题了 对扫描线也算是有了第一次的理解 无非就是更新新的向上的区间长度 然后去查询就是了 而查询是O 1 的 因为可以通过树的最上根节点得到的 include

随机推荐

  • 投资人和创业者如何相处 听听几位大佬观点

    在8月14日的以太Bit大会上 源码资本创始人曹毅 清流资本董事总经理王梦秋 华创资本合伙人吴海燕 明势资本创始人黄明明 零一创投合伙人吴运龙坐在了一起 讨论起投资人的生存法则 以及和创业者的合作关系 投资人能为创业者做什么 曹毅 我觉得我
  • sklearn中的特征工程(过滤法、嵌入法和包装法)

    特征工程的第一步 理解业务 如果特征比较少且容易理解 我们可以自行判断特征的取舍 如前面的泰坦尼克号数据集 但是 在真正的数据应用领域 比如金融 医疗 电商 我们的数据不可能像泰坦尼克号数据的特征这样少 这样明显 那如果遇见极端情况 我们无
  • 我的2022年度总结

    随着Apple Store越来越成熟 以及越来越多的开发者和公司希望在该平台上投放自己的产品 iOS APP上架成为许多开发者和公司普遍关注的话题 最近发现有款开发工具非常好用 特意去找了一个工具的成长历程 最早的版本 发现此款工具从202
  • 西门子S7报文解析

    1 报文的基本格式 1 1 第1和第2个字节是 固定报文头03 00 这里我们就用到三种报文 a 初始化 b 读 c 写 都是这种格式 1 2 第3和第4个字节是 整个报文的长度 其它部分就是各种报文的个性化处理了 下面分析大量报文的案例进
  • Open3D 最小二乘拟合二维圆

    目录 一 算法原理 二 代码实现 三 结果展示 一 算法原理 见 Open3D 最小二乘拟合二维圆 python详细过程版 二 代码实现 import open3d as o3d import numpy as np import matp
  • FBX SDK下载安装教程

    目录 FBX SDK介绍 FBX SDK下载安装 FBX SDK介绍 Fbx 是 Autodesk MotionBuilder 固有的文件格式 用于创建 编辑和混合运动捕捉和关键帧动画 也常用于动画文件在不同的DCC 三维软件 之间的互导
  • SpringBoot 场景开发多面手成长手册

    小册介绍 SpringBoot之强大 SpringBoot 的强大之处不言而喻 其底层 SpringFramework 强大的 IOC 容器和 AOP 机制 加之 SpringBoot 的自动装配 使得 SpringBoot 成为当今 Ja
  • 聊聊你不知道的Java变量转型

    单枪匹马你别怕 一腔孤勇又如何 这一路你可以哭 但不能怂 请关注 源码猎人 目录 简介 标识符命名规则 类变量 静态变量 实例变量 局部变量 变量数据类型 基本类型之间的转换 常见面试题 简介 Java变量分为类变量 实例变量 局部变量 在
  • 自动化测试工具大盘点

    本系列文章我们将带大家一起了解一下互联网大厂中通科技的自动化测试平台的搭建历程 从以下四个方面展开介绍 为什么要做这样一个统一的自动化测试平台 是如何做到统一的 平台上线后的收益 最后一部分会给大家分享一下他们未来的一些开发计划 在本系列文
  • 通过一份经典的UML类图来学会如何读懂UML类图

    一份经典的UML类图如下 继承关系 实线 空心三角形 鸟 动物 鸟继承动物 实现接口 虚线 空心三角形 大雁 飞翔 大雁实现了飞翔接口 实现接口 棒棒糖表示法 唐老鸭 讲人话 唐老鸭实现讲人话接口 关联关系 gt 实线剪头 企鹅 gt 气候
  • there.js3d模型动画交互

    there js3d模型动画交互 https blog csdn net qq 38316721 article details 81281749
  • Python+OpenCV开发环境搭建

    Python OpenCV开发环境搭建 本文主要介绍了Win7 64位系统下Python OpenCV开发环境的搭建 1 安装Python 2 7 13 从官网上或这里http download csdn net detail sysuzh
  • drools 7.x KIE API解析

    https blog csdn net wo541075754 article details 75004575 http dyingbleed com drools 2
  • git生成SSH密钥提示ssh文件不存在-已解决

    参考文章 https blog csdn net qq 41530816 article details 100179808 utm medium distribute pc relevant none task blog 2 7Edefa
  • 【腾讯云 Cloud studio 实战训练营】真正做到让你的开发成本只在编码

    文章目录 写在前面 CODING Cloud studio工具 在线编码 运行项目 代码上传 Cloud Studio 开发贪吃蛇 写在最后 写在前面 期待已久的体验活动终于来了 Clound Studio用了才知道有多爽 Cloud St
  • 给即将学习大数据的几点建议

    以下内容摘自一位学习大数据技术的朋友的感想和总结 文采飞扬 字字肺腑 产生共鸣 经本人同意 发布至此 希望给很多站在大数据门口驻足 犹疑 徘徊的小伙伴一些建议 大数据行业发展不等人 要想改变现状 现在出发 即可动手 大数据学习现在开始 为时
  • 静态类型和动态类型的区别

    一 静态类型和动态类型的区别 引自MDN Web Docs 动态类型 the interpreter assigns variables a type at runtime based on the variable s value at
  • Failed to replace DataSource with an embedded database for tests

    Failed to replace DataSource with an embedded database for tests 错误提示 Caused by java lang IllegalStateException Failed t
  • 如何完全卸载Android Studio

    打开控制面板或360软件管家等执行常规的卸载操作 找到SDK的安装目录手动删除SDK 进入 C Users lt 你的用户名下 gt 目录下 手动删除 android AndroidStudioX X gradle 目录 完成
  • hdu 1255 覆盖的面积

    Problem acm hdu edu cn showproblem php pid 1255 Reference hdu 1255 覆盖的面积 矩形面积并 矩形面积交 矩形周长并 线段树 扫描线总结 Meaning 给出 n 个矩形 求它