ZOJ1610(区间覆盖问题+线段树)

博客介绍了如何解决ZOJ1610的区间覆盖问题,参照了POJ2528的解题思路。文章首先说明了输入数据的处理,将染色区间转化为可对应参考题目的形式。接着,使用ret数组记录每种颜色出现的段数,并强调线段树下推函数完成后必须清除当前节点标记,以免影响后续计算。此外,文章指出初始化tree数组时应考虑为一种特殊颜色-1,确保不相邻区间算作不同段。

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

区间覆盖问题,参考POJ2528的解法。(以下简称POJ2528为参考题)

1.对于输入数据的处理:输入和参考题不同,输入的是染色区间的端点,而参考题输入的是一段区间的编号。所以对数据进行输入的处理,处理思路为:[0,4]相当于对四段区间覆盖(也可以说染色):【0,1】,【1,2】,【2,3】,【3,4】我们根据参考题的解法对区间进行编号处理:将右端点的值作为区间的编号,这样我们的输入就可以实现端点到区间的转换。就可以根据参考题的解法来处理。处理方式:输入L,R后,将L++.

2. 使用ret数组来存储每种颜色出现的段数。

3.注意下推函数中,在下推完成后必须对当前结点的标记删除!否则一个非常重要的影响是:在线段树中考虑该节点,我们更新该节点区间下的染色时,该节点底层的染色会被该节点的颜色覆盖!

4.我们将tree[]数组的初始值考虑成一种颜色-1,遍历到底层时不能返回(将temp更新为-1)因为按照题意,不相邻的两端区间的染色(中间即使没有其他颜色)也算作一种颜色的两段。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
const int maxn=8000+10;
int tree[maxn<<4];
int ret[maxn];
int n,L,R,C;
void pushdown(int rt)
{
    tree[rt<<1]=tree[rt<<1|1]=tree[rt];
    tree[rt]=-1;
}
void update(int l,int r,int rt)
{
    if(L<=l&&r<=R)
    {
        tree[rt]=C;
        return;
    }
    int m=(l+r)>&g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值