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

【算法】线段树的应用-力扣3479. 将水果装入篮子 III

这个题就是线段树的应用,但是与之前的文章相比,此处构建的线段树相当于“最大树”,每个节点存储的不是子节点的和,而是子节点中的最大值。

#include <bit>
class SegmentTree {
    vector<int> mx;

    void maintain(int o) {
        // 根据不同的线段树的需求修改对应的代码,
        // 本题需要找到最左边最大的点,因此需要构建最大线段树
        mx[o] = max(mx[o * 2], mx[o * 2 + 1]);
    }

    void build(const vector<int>& a, int o, int l, int r) {
        if(l == r) {
            mx[o] = a[l];
            return;
        }
        int m = (l + r) / 2;
        build(a, o * 2, l, m);
        build(a, o * 2 + 1, m + 1, r);
        maintain(o);
    }
    public:
    SegmentTree(const vector<int>& a) {
        size_t n = a.size();
        mx.resize(2 << bit_width(n - 1));
        build(a, 1, 0, n - 1);
    }

    int findFirstAndUpdate(int o, int l, int r, int x) {
        if(mx[o] < x) {
            return -1;
        }
        if(l == r) {
            mx[o] = -1;
            return l;
        }
        int m = (l + r) / 2;
        int i = findFirstAndUpdate(o * 2, l, m, x);
        if(i < 0) {
            i = findFirstAndUpdate(o * 2 + 1, m + 1, r, x);
        }
        // 注意更新线段树上部的信息
        maintain(o);
        return i;
    }
};

class Solution {
public:
    int numOfUnplacedFruits(vector<int>& fruits, vector<int>& baskets) {
        SegmentTree t(baskets);
        int n = baskets.size(), result = 0;
        for(auto x : fruits) {
            if(t.findFirstAndUpdate(1, 0, n - 1, x) < 0) {
                result++;
            }
        }
        return result;
    }
};

注意此处就涉及到之前说的那个s + t 会溢出的问题,因此不能用移位操作来实现。

相关文章:

  • 搭建阿里云专有网络VPC
  • go语言zero框架拉取内部平台开发的sdk报错的修复与实践
  • 硬件驱动——51单片机、LED、动态数码管
  • C# Unity 唐老狮 No.9 模拟面试题
  • 网络安全与七层架构
  • SQL子查询与MyBatis映射
  • plantuml画甘特图gantt
  • AUTOSAR_CP_EthernetSwitchDriver
  • rpc grpc
  • C语言零基础入门教程:操作系统原理(上)
  • 火山引擎云上实战:一键部署 DeepSeek 大模型(蒸馏版)
  • 【工具】ReConPlot一个可视化和解释基因组重排的R包
  • AutoGen学习笔记系列(十六)Examples - Company Research
  • VSTO(C#)Excel开发7:自定义任务窗格
  • 【原创】在高性能服务器上,使用受限用户运行Nginx,充当反向代理服务器[未完待续]
  • 《又是二叉树?递归与回溯的经典应用》
  • 嵌入式人工智能应用- 第七章 人脸识别
  • 什么是OF
  • java学习总结(四):MyBatis
  • 低成本抗衡DeepSeek-R1!QwQ-32B本地部署教程:消费级硬件可部署
  • 中国华能:1-4月新能源装机突破1亿千瓦,利润总额再创新高
  • 广东茂名信宜出现龙卷,一家具厂铁皮房受损
  • 欧洲加大力度招募美国科研人员
  • 日月谭天 | 赖清德倒行逆施“三宗罪”,让岛内民众怒不可遏
  • 常州新型碳材料集群产值近二千亿,请看《浪尖周报》第24期
  • 义乌至迪拜“铁海快线+中东快航”首发,物流成本降低18%