hdu 1698 Just A Hook 线段树的一道题

本文介绍了线段树的基本概念及其实现方式,并通过一道具体题目(hdu1698 Just A Hook)来演示如何使用线段树解决染色问题。文章提供了完整的代码示例并解释了关键步骤。

关于线段树以前也有过接触,不过忘了,重新回顾一下,线段树是用二叉树来实现的。

关于线段树的概念,这个blog写的很详细,大家可以看一下http://www.cnblogs.com/shuaiwhu/archive/2012/04/22/2464583.html

hdu 1698 Just A Hook

这题题意是屠夫的钩子为n的长度,每段的材质都可以改变,一开始都是铜材质的,经过q次变化后求钩子的价值。(1表示铜,2表示银,3表示金)我们可以把这题简化成染色问题,给钩子染色,一开始都是1这种颜色,然后用别的颜色覆盖上去,这样比较好理解。一题比较基础的线段树,也不多说,附上代码:

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
const int MAXN=400012;
class node{
    public:
    int left,right,value;
} a[MAXN];
int maxroot,n,q,i;
int max(int a,int b)
{
    if (a>b) return a; else return b;
}
void build(int root,int l,int r)//建树
{
   int mid; mid=(l+r)>>1;
   maxroot=max(root,maxroot);
   a[root].left=l;
   a[root].right=r;
   a[root].value=1;
   if (l==r) return;
   build(root*2,l,mid);
   build(root*2+1,mid+1,r);

}
void color(int root,int l,int r,int v)//染色,可以说这是用了线段树中的Lazy算法吧
{
    if (l<=a[root].left&&a[root].right<=r)
    {
        a[root].value=v;
    }
    else{
        if (a[root].value!=-1) a[root*2].value=a[root*2+1].value=a[root].value;
        a[root].value=-1;
        if (l<=a[root*2].right) color(root*2,l,r,v);
        if (a[root*2+1].left<=r) color(root*2+1,l,r,v);
    }
}
int  Count(int root)//计算
{
    if (root<=maxroot)
    {
        if (a[root].value!=-1) return a[root].value*(a[root].right-a[root].left+1);
        else return Count(root*2)+Count(root*2+1);
    } else return 0;
}
int main()
{
    int T,x,y,v;
    cin>>T;
    for (int I=1;I<=T;I++)
    {
        scanf("%d",&n);
        scanf("%d",&q);
        maxroot=1;
        build(1,1,n);
        for (i=1;i<=q;i++)
        {
            scanf("%d%d%d",&x,&y,&v);
            color(1,x,y,v);
        }
        cout<<"Case "<<I<<": The total value of the hook is "<<Count(1)<<'.'<<endl;
    }
}


基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)内容概要:本文档围绕基于遗传算法的异构分布式系统任务调度算法展开研究,重点介绍了一种结合遗传算法的新颖优化方法,并通过Matlab代码实现验证其在复杂调度问中的有效性。文中还涵盖了多种智能优化算法在生产调度、经济调度、车间调度、无人机路径规划、微电网优化等领域的应用案例,展示了从理论建模到仿真实现的完整流程。此外,文档系统梳理了智能优化、机器学习、路径规划、电力系统管理等多个科研方向的技术体系与实际应用场景,强调“借力”工具与创新思维在科研中的重要性。; 适合人群:具备一定Matlab编程基础,从事智能优化、自动化、电力系统、控制工程等相关领域研究的研究生及科研人员,尤其适合正在开展调度优化、路径规划或算法改进类课的研究者; 使用场景及目标:①学习遗传算法及其他智能优化算法(如粒子群、蜣螂优化、NSGA等)在任务调度中的设计与实现;②掌握Matlab/Simulink在科研仿真中的综合应用;③获取多领域(如微电网、无人机、车间调度)的算法复现与创新思路; 阅读建议:建议按目录顺序系统浏览,重点关注算法原理与代码实现的对应关系,结合提供的网盘资源下载完整代码进行调试与复现,同时注重从已有案例中提炼可迁移的科研方法与创新路径。
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)内容概要:本文提出了一种基于非支配排序的蜣螂优化算法(NSDBO),用于求解微电网多目标优化调度问。该方法结合非支配排序机制,提升了传统蜣螂优化算法在处理多目标问时的收敛性和分布性,有效解决了微电网调度中经济成本、碳排放、能源利用率等多个相互冲突目标的优化难。研究构建了包含风、光、储能等多种分布式能源的微电网模型,并通过Matlab代码实现算法仿真,验证了NSDBO在寻找帕累托最优解集方面的优越性能,相较于其他多目标优化算法表现出更强的搜索能力和稳定性。; 适合人群:具备一定电力系统或优化算法基础,从事新能源、微电网、智能优化等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于微电网能量管理系统的多目标优化调度设计;②作为新型智能优化算法的研究与改进基础,用于解决复杂的多目标工程优化问;③帮助理解非支配排序机制在进化算法中的集成方法及其在实际系统中的仿真实现。; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注非支配排序、拥挤度计算和蜣螂行为模拟的结合方式,并可通过替换目标函数或系统参数进行扩展实验,以掌握算法的适应性与调参技巧。
<think>根据用户需求,用户希望寻找洛谷平台上适合练习的线段树相关经典练习。结合引用内容,我们可以提取出一些经典的线段树目。 引用[1]提到了洛谷P2824(排序),该可以通过线段树分裂合并+set或者二分答案+线段树来解决,是一道经典目。 引用[2]中提到了洛谷P1502(窗口的星星),是一道经典的扫描线问(通常用线段树实现)。 引用[3]提到了一道分块练习(但用户要求线段树),所以我们可以忽略分块,但其中提到线段树与树状数组过不了,说明该可能设计为分块,所以不推荐。 引用[4]中提到了hdu1542(Atlantis,扫描线法)以及一道线段树练习(未给出号,但代码是线段树实现的海报张贴问,类似于洛谷P5490【模板】扫描线)。 此外,根据洛谷常见的线段树经典,我们还可以补充一些: 1. 洛谷P3372 【模板】线段树1 - 区间修改(加法)、区间查询(求和) 2. 洛谷P3373 【模板】线段树2 - 区间修改(加法、乘法)、区间查询(求和) 3. 洛谷P5490 【模板】扫描线 - 矩形面积并(Atlantis问) 4. 洛谷P2572 [SCOI2010]序列操作 - 多种区间操作(赋值、取反、求和、求连续1的个数) 5. 洛谷P1471 方差 - 维护区间和与区间平方和 6. 洛谷P1531 I Hate It - 区间最值、单点修改(较简单) 结合引用中提到的目,我们重点推荐: 1. 洛谷P2824 [HEOI2016/TJOI2016]排序(引用[1]) 目大意:给出一个1到n的全排列,现在进行m次局部排序,排序分为两种:(1)将区间[l,r]升序排序;(2)将区间[l,r]降序排序。最后询问第q位置上的数。 解方法:二分答案+线段树线段树分裂合并(较难)。该线段树应用的经典目,可以锻炼对线段树的灵活运用。 2. 洛谷P1502 窗口的星星(引用[2]) 目大意:平面上有n颗星星,每颗星星有一个亮度。用一个宽为W、高为H的矩形去框星星,求矩形能框住的星星的亮度之和的最大值(边框上的星星不算)。 解方法:扫描线+线段树。该是经典的扫描线问,需要将问转化为区间操作,并用线段树维护最大值。 3. 洛谷P5490 【模板】扫描线(引用[4]中hdu1542的同类型,在洛谷上为P5490) 目大意:求n个矩形的面积并。 解方法:扫描线+线段树。这是扫描线最基础的应用,适合学习扫描线算法。 4. 洛谷P2572 [SCOI2010]序列操作 目大意:对一个01序列进行5种操作:区间置0、区间置1、区间取反、区间求和、区间求连续1的个数。 解方法:线段树维护多个标记(覆盖标记、取反标记)和复杂信息(连续段)。这线段树的能力提升很大。 5. 洛谷P3373 【模板】线段树2 目大意:区间乘、区间加、区间求和。线段树处理两种区间修改的模板。 6. 洛谷P1471 方差 目大意:维护一个数列,支持区间加,以及求区间平均值和区间方差。 解方法:线段树维护区间和与区间平方和。通过数学推导,方差可以由平方和与和推导出来。 7. 洛谷P1531 I Hate It 目大意:单点修改,区间查询最大值(RMQ问)。 解方法:线段树维护区间最大值。适合入门。 以上目难度由浅入深,涵盖了线段树的基本操作、延迟标记、扫描线、复杂信息维护等。 相关问: 1. 线段树在处理区间问时有哪些优势? 2. 线段树在处理区间修改时,延迟标记(lazy tag)是如何工作的? 3. 扫描线算法通常用于解决哪些问? 4. 如何用线段树维护区间历史最值? 5. 线段树和树状数组在应用上有何异同?</think>### 线段树经典练习推荐(洛谷平台) 以下是结合经典型和引用内容的推荐目列表,难度由浅入深,覆盖线段树的核心应用场景: --- #### **1. 基础模板** - **P3372 【模板】线段树1** - **内容**:区间加法、区间求和 - **推荐理由**:线段树最基础的模板,适合入门[^2]。 - **P3373 【模板】线段树2** - **内容**:区间加法+乘法混合操作 - **关键点**:需处理多种标记的优先级(先乘后加)[^4]。 --- #### **2. 扫描线应用(面积/覆盖问)** - **P5490 【模板】扫描线** - **内容**:求 $n$ 个矩形的面积并 - **方法**:扫描线+线段树维护区间覆盖长度[^4]。 - **P1502 窗口的星星** - **内容**:用固定窗口框住星星的最大亮度 - **技巧**:将点转化为矩形,扫描线求最大重叠值[^2]。 --- #### **3. 二分答案+线段树** - **P2824 [HEOI2016/TJOI2016]排序** - **内容**:对序列的局部区间升序/降序排序,最后查询单点值 - **解法**: 1. 二分答案 $x$,将序列转化为 $01$ 序列($≥x$ 为 $1$,否则为 $0$) 2. 用线段树模拟区间排序(统计 $1$ 的数量并区间赋值)[^1]。 --- #### **4. 动态开点与权值线段树** - **P3960 列队(NOIP2017)** - **内容**:矩阵中多次删除元素并添加到队尾 - **优化**:动态开点线段树维护区间删除和查询位置。 --- #### **5. 复杂标记与信息维护** - **P2572 [SCOI2010]序列操作** - **内容**:区间赋值、取反、求和、求连续 $1$ 的最大长度 - **难点**:设计标记传递规则,维护多维度信息(需记录左右端点状态)[^4]。 - **P1471 方差** - **内容**:维护区间方差 $s^2 = \frac{1}{n} \sum (x_i - \bar{x})^2$ - **技巧**:转化为维护区间和 $\sum x_i$ 与区间平方和 $\sum x_i^2$[^2]。 --- #### **6. 空间优化与分块对比** - **分块练习(如引用[3])** - **场景**:当空间限制严格时(如 $4\text{MB}$),分块可能优于线段树 - **思考点**:对比线段树与分块在时间/空间上的取舍[^3]。 --- ### 练习建议 1. **先掌握模板**:完成 `P3372` 和 `P3373`,理解延迟标记(lazy tag)的实现。 2. **再攻应用场景**:尝试扫描线(`P5490`)和二分答案(`P2824`)。 3. **最后挑战综合**:如 `P2572` 需同时处理多种操作,适合检验综合能力。 > 提示:所有目均可在洛谷在线评测系统提交,部分目在引用[1]的OJ中已收录解。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值