H. Excluded Min (思维、线段树)

本文详细介绍了如何使用线段树解决区间最大值查询与更新的问题,并结合了其他数据结构如BIT(前缀和树)和辅助线段树,实现了在动态维护线段集合中找出未被覆盖的线段。代码示例展示了C++实现,包括线段树的构建、查询、更新和删除操作,适合进阶学习者理解区间数据结构的高效运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

https://codeforces.com/gym/103260/problem/H
在这里插入图片描述

思路

在这里插入图片描述
写了一坨答辩代码,已经神志不清了,后面再补上思路吧,先给上题解的描述还有草稿纸上一些图。
简而言之,学会了一种套路,求一些线段中选出不被任何一个线段完全覆盖的所有线段,支持删除线段操作。
在这里插入图片描述

代码

#include <bits/stdc++.h>
using namespace std;

#define MAXN 500005

int n, q;
int a[MAXN];
pair<pair<int, int>, int> Q[MAXN];


#define LX (x<<1)
#define RX ((x<<1)|1)


struct segment_tree {
   
   
    struct node {
   
   
        int l, r;
        int v;      // 区间最大值
        int num;    // 区间线段个数
        int tag;    // 区间加标记
    } a[MAXN*8];

    void merge(int x) {
   
   
        if (a[x].l == a[x].r) return;
        a[x].num = a[LX].num + a[RX].num;
        a[x].v = max(a[LX].v, a[RX].v);
    }

    void build(int x, int l, int r) {
   
   
        a[x].l = l;
        a[x].r = r;
        a[x].num = a[x].tag = 0;
        a[x].v = -1;
        if (l == r) return;
        build(LX, l, (l+r)/2);
        build(RX, (l+r)/2+1, r);
        merge(x);
    }

    void down_tag(int x) {
   
   
        if (a[x].l == a[x].r) return;
        if (a[LX].num) a[LX].v += a[x].tag, a[LX].tag += a[x].tag;
        if (a[RX].num) a[RX].v += a[x].tag, a[RX].tag += a[x].tag;
        a[x].tag = 0;
    }

    void set(int x, int pos, int v) {
   
          // 将线段 pos 处的值设置为 v,若 v==-1 则说明清除这个点
        if (a[x].l == a[x].r) {
   
   
            a[x].v = v;
            a[x].num = (v>=0);
            return;
        }
        down_tag(x);
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值