首页 > 编程语言 >【恐怖の算法】 扫描线

【恐怖の算法】 扫描线

时间:2024-12-03 22:10:08浏览次数:5  
标签:恐怖 int 线段 算法 扫描线 权值 区间 矩形

【恐怖の算法】 扫描线

引入

扫描线一般运用在图形上面,它和它的字面意思十分相似,就是一条线在整个图上扫来扫去,它一般被用来解决图形面积,周长,以及二维数点等问题。

二维矩形面积并问题

在二维坐标系上,给出多个矩形的左下以及右上坐标,求出所有矩形构成的图形的面积。

过程

根据图片可知总面积可以直接暴力即可求出面积,如果数据大了怎么办?这时就需要讲到 扫描线 算法。

现在假设我们有一根线,从下往上开始扫描:

扫描线示意图

按这样把矩形分成几个部分,小矩形的高是扫过的距离。我们可以发现,小矩形的宽一直在变化。

给每一个矩形的上下边进行标记,下面的边标记为 1,上面的边标记为 -1。每遇到一个水平边时,让这条边(在横轴投影区间)的权值加上这条边的标记。

小矩形(不一定只有一个)的宽度就是整个数轴上权值大于 0 的区间总长度。

实现

很容易想到可以用线段树。

用线段树维护矩形的长,也就是整个数轴上覆盖次数大于 0 的点。

需求列举如下:

  • 一段区间权值加 1、减 1。

  • 统计整个数轴上,区间权值大于 0 的「区间长度和」。

如果你尝试直接用普通线段树模板来实现的话,也许会遇到些挫折。具体地,由于在区间加时,即使修改区间和节点管理区间重合,我们还是不能常数时间知道覆盖次数如何变化。这是因为我们不能直接知道:管理范围里有多长的区间会从 1 变成 0(从 0 变成 1)。

这道题只需要朴素的分治就能实现:维护每个节点管理区间中「整体 修改的权值和 w[]」(类似不用下放的懒惰标记)和「覆盖长度 v[]」两个信息。

需要用到离散化。

例题

题目传送门:CZOJ #25.「模板」扫描线

分析

模版题,同理直接用线段树

离散化+线段树+模拟

由于数据量太大,我们先把所有的墙壁离散化,用线段树维护每个离散化后的横坐标的最高点,然后模拟求出答案。

代码

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int n;
struct a {
    int x;
    int h;
    int v;
    int l;
} r[200005] = {};
int d[100005] = {};
int cmh(a x, a y) { return x.h < y.h; }
int cmx(a x, a y) { return x.x < y.x; }
int t[400005] = {};
int m = 0, ans[400005][2] = {};
void ad(int k, int x, int l, int r, int v) {
    int mid = (l + r) / 2;
    t[k] += v;
    if (l != r) {
        if (x <= mid) {
            ad(k * 2, x, l, mid, v);
        } else {
            ad(k * 2 + 1, x, mid + 1, r, v);
        }
    }
}
int rank(int k, int l, int r) {
    int mid = (l + r) / 2;
    if (t[k] == 0) {
        return 0;
    }
    if (l == r) {
        return mid;
    }
    if (t[k * 2 + 1] == 0) {
        rank(k * 2, l, mid);
    } else {
        rank(k * 2 + 1, mid + 1, r);
    }
}
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> r[i * 2].h >> r[i * 2 - 1].x >> r[i * 2].x;
        r[i * 2 - 1].h = r[i * 2].h;
        r[i * 2 - 1].v = 1;
        r[i * 2].v = -1;
    }
    sort(r + 1, r + 2 * n + 1, cmh);
    r[0].x = 1000000001;
    r[2 * n + 1].x = r[0].x;
    for (int i = 1; i <= 2 * n; i++) {
        r[i].l = r[i - 1].l + (r[i].h != r[i - 1].h);
        d[r[i].l] = r[i].h;
    }
    sort(r + 1, r + 2 * n + 1, cmx);
    int i = 1, j = 1;
    int now = 0, pas = 0;
    while (i <= 2 * n) {
        j = i;
        while (r[j].x == r[i].x) {
            ad(1, r[i].l, 1, 100000, r[i].v);
            now = rank(1, 1, 100000);
            i++;
        }
        if (pas != now) {
            m++;
            ans[m][0] = r[j].x;
            ans[m][1] = d[pas];
            m++;
            ans[m][0] = r[j].x;
            ans[m][1] = d[now];
            pas = now;
        }
    }
    ans[m][1] = 0;
    cout << m << endl;
    for (int i = 1; i <= m; i++) {
        cout << ans[i][0] << " " << ans[i][1] << endl;
    }
}

噩梦算法の终结~

标签:恐怖,int,线段,算法,扫描线,权值,区间,矩形
From: https://www.cnblogs.com/yhy2013/p/18585168

相关文章

  • c语言顺序结构,算法,输出与输入
    ......
  • 基于MIMO系统的PE-AltMin混合预编码算法matlab性能仿真
    1.算法仿真效果matlab2022a仿真结果如下(完整代码运行后无水印):  仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要       在现代无线通信系统中,多输入多输出(Multiple-InputMultiple-Output,MIMO)技术是提高频谱效率和数据传输速率的关键。然而......
  • 数据结构与算法
    一、引言数据结构与算法是计算机科学中的基础概念,它们相互依存,共同构成了计算机程序设计和问题解决的基础。数据结构定义了数据的组织方式,而算法则是解决问题的步骤。选择合适的数据结构可以提高算法的效率,而高效的算法则需要合适的数据结构来支撑。本文将详细介绍数据结构与......
  • 前端必须掌握的16道基础算法
    前端必须掌握的16道基础算法如果对各位老师有用,欢迎点赞评论。(#^.^#)1.求字符串中最长无重复字符串长度(求长度和不重复字符串)//第一题答案:求字符串中最长无重复字符串的长度start//Math.max.apply(this,itemNum)调用Math的max方法‘继承’const......
  • 搞定leetcode面试经典150题之哈希算法
    系列博客目录搞定leetcode面试经典150题之哈希算法搞定leetcode面试经典150题之双指针搞定leetcode面试经典150题之滑动窗口文章目录系列博客目录理论知识1.哈希函数(HashFunction)2.哈希表(HashTable)通过HashMap实现3.哈希算法的应用4.哈希算法的时间复杂度编......
  • 智慧工地算法视频分析服务器安全帽安全服检测:安防设备中的网络参数都分别代表什么?
    在探讨视频智能分析系统的广泛应用于网络安防设备的核心参数时,不可避免地要深入了解其背后的技术支撑与配置细节。这一系统,凭借其强大的视频接入与查看、智能分析、任务调度等功能,已经在工厂、工地、社区等多个场景中展现出了卓越的性能与价值。而网络安防设备,作为这一系统的基石,......
  • 水域智能监管视频分析服务器水体变色识别算法“智鉴水质”的技术应用
    随着环境保护意识的不断增强,水域智能监管逐渐成为水资源管理和生态环境保护的重要手段。水体变色是水域生态状况变化的一个重要指标,能够反映水体污染、富营养化等问题。因此,如何实时、准确地识别水体变色现象,成为了水域管理中的一个重要课题。本文将探讨基于视频分析技术的水体变......
  • AI算法网关视频分析网关垃圾桶满溢检测助力构建环保卫生管理方案
    随着城市化进程的加快,垃圾处理问题日益严峻。传统的垃圾桶管理方式往往依赖于定期巡检,效率低下且容易忽视临时的使用高峰。近年来,视频分析技术的进步使得智能垃圾桶管理成为可能。本文将探讨一种基于算法网关视频分析网关的垃圾桶满溢检测算法,以实现自动化和智能化管理。一、垃......
  • 【初阶数据结构与算法】二叉树顺序结构---堆的应用之堆排、Top-K问题
    文章目录一、堆排引入之使用堆排序数组二、真正的堆排1.向上调整算法建堆2.向下调整算法建堆3.向上和向下调整算法建堆时间复杂度比较4.建堆后的排序4.堆排序和冒泡排序时间复杂度以及性能比较三、Top-K问题一、堆排引入之使用堆排序数组   在了解真正的堆排之......
  • 蓝桥杯c++算法秒杀【7】之数据结构(修改数组、翻转括号序列、双向排序:::非常典型的必刷例
    别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! !  关注博主,更多蓝桥杯nice题目静待更新:)  数据结构一、修改数组【问题描述】        给定一个长度为N的数组A=[A1,A2,...,AN],数组中有可能有重复出现的整数。        现在小明要按以下方法将其......