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 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国在海岸线
  • poj 1195 Mobile phones

    Problem poj org problem id 1195 vjudge net contest 146952 problem C Meaning 有一个 S S 的正方形区域 两维的下标范围都是是 0 S 1 有 4 种操作 1 0
  • c编程:求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

    求出4 4矩阵中最大和最小元素值及其所在行下标和列下标 求出两条主对角线元素之和 include
  • 线段树(java)

    线段树描述 线段树是一种二叉搜索树 与区间树相似 它将一个区间划分成一些单元区间 每个单元区间对应线段树中的一个叶结点 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数 时间复杂度为O logN 而未优化的空间复杂度为2N 实际应
  • stl_set

    begin 返回指向第一个元素的 迭代器 clear 清除所有元素 size 集合中元素的数目 count 返回某个值元素的个数 empty 如果集合为空 返回true 真 end 返回指向最后一个元素之后的迭代器 不是最后一个元素器 in
  • Buncket Sort桶排序(c++)实现代码

    代码原理我就不说了 参考 算法导论 原书第三版 p112 直接上代码会不会很爽 ConsoleApplication1 cpp 定义控制台应用程序的入口点 This programme is designed to show the Bun
  • HDU1007(最近点对问题)

    题意不难理解 就是找到最近的两个点 计算其距离 除以2就是所求的圆的半径 思路很简单 运用分治的思想 先划分区间 分别找到左右区间中的最近点对 再合并区间 找到区间间的最近点对 注意如果用qsort 进行排序可能会超时 include
  • “Shopee杯” 武汉大学(网络预选赛)D - DIY Masks at Home

    Shopee杯 武汉大学 网络预选赛 D DIY Masks at Home 题目链接 Click 时间限制 C C 5秒 其他语言10秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 题
  • 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 个点
  • ACM: Poker Game

    题目描述 A poker deck contains 52 cards Each card has a suit of either clubs diamonds hearts or spades denoted C D H S in th
  • 数的划分(递归)

    整数划分是另外的问题 题目描述 Description 将整数n分成k份 且每份不能为空 任意两种划分方案不能相同 不考虑顺序 例如 n 7 k 3 下面三种划分方案被认为是相同的 7 1 1 5 7 1 5 1 7 5 1 1 问有多少种
  • 二维线段树【模板——给出对应注释】

    闲话少说 直接看注释反而会更容易读懂这段二维线段树的模板 include
  • ACM-子串(字符串处理)

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

    三角形的外接圆圆心是任意两边的垂直平分线的交点 三角形外接圆圆心叫外心
  • hdu 3966 Aragorn's Story

    Problem acm hdu edu cn showproblem php pid 3966 Reference 树链剖分 树链剖分原理 树链剖分详解及模板 HDU3966 树链剖分 Meaning 一棵 n 个点的树 每给结点有个值 三
  • UVa 12504 Updating a Dictionary

    Problem uva onlinejudge org index php option com onlinejudge Itemid 8 page show problem problem 3948 题意 貌似是模拟 Source Cod
  • Matrix 【POJ - 2155】【二维线段树+永久化标记】

    题目链接 挺好的一道题 一开始用lazy标记往下推 总是推不出样例的正解 然后就去看了相关博客 发现却确实如此 在这里是无法用lazy标记来层层推的 并且还会出现超内存的情况 所以 便改用了永久化标记来解这道题 还有一件是 关于discus
  • 蓝桥杯 填字母游戏(博弈论)

    小明经常玩 LOL 游戏上瘾 一次他想挑战K大师 不料K大师说 我们先来玩个空格填字母的游戏 要是你不能赢我 就再别玩LOL了 K大师在纸上画了一行n个格子 要小明和他交替往其中填入字母 并且 1 轮到某人填的时候 只能在某个空格中填入L或

随机推荐

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

    在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 个矩形 求它