4927 线段树练习5

本文介绍了一道关于线段树的编程题目,包括题目描述、输入输出格式及样例,并给出了详细的代码实现。通过该练习,读者可以了解如何使用线段树解决区间更新和查询问题。

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

4927 线段树练习5
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
查看运行结果
题目描述 Description
有n个数和5种操作

add a b c:把区间[a,b]内的所有数都增加c

set a b c:把区间[a,b]内的所有数都设为c

sum a b:查询区间[a,b]的区间和

max a b:查询区间[a,b]的最大值

min a b:查询区间[a,b]的最小值

输入描述 Input Description
第一行两个整数n,m,第二行n个整数表示这n个数的初始值

接下来m行操作,同题目描述

输出描述 Output Description
对于所有的sum、max、min询问,一行输出一个答案

样例输入 Sample Input
10 6

3 9 2 8 1 7 5 0 4 6

add 4 9 4

set 2 6 2

add 3 8 2

sum 2 10

max 1 7

min 3 6

样例输出 Sample Output
49

11

4

注意
set有可能是0,所以立个flag
错了两次了qwq

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100000+50;
int n,q,x,y,z;
long long num[N];
struct seg_tree{
    int l,r;
    long long sum,minn,maxx;//要维护的值
    int ax_add,ax_set;//标记
    bool flag;
}t[N<<2];
void updata(int m){//回溯数据更改
    t[m].sum=t[m<<1].sum+t[m<<1|1].sum;
    t[m].maxx=max(t[m<<1].maxx,t[m<<1|1].maxx);
    t[m].minn=min(t[m<<1].minn,t[m<<1|1].minn);
    return ;
}
void build(int m,int ll,int rr){
    t[m].l=ll;t[m].r=rr;
    if(ll==rr){
        t[m].minn=num[ll];
        t[m].maxx=num[ll];
        t[m].sum=num[ll];
        return ;
    }
    int mid=ll+rr>>1;
    build(m<<1,ll,mid);//递归处理左儿子
    build(m<<1|1,mid+1,rr);//右儿子
    updata(m);//回溯数据收集
    return ;
}
void add(int m,int v){
    t[m].sum+=(t[m].r-t[m].l+1)*v;
    t[m].maxx+=v;
    t[m].minn+=v;
    t[m].ax_add+=v;
    return ;
}
void set(int m,int v){
    t[m].sum=(t[m].r-t[m].l+1)*v;
    t[m].maxx=v;
    t[m].minn=v;
    t[m].ax_add=0;
    t[m].ax_set=v;
    t[m].flag=1;
    return ;
}
void spread(int m){
    if(t[m].flag){
        set(m<<1,t[m].ax_set);
        set(m<<1|1,t[m].ax_set);
        t[m].ax_set=0;
        t[m].flag=0;
    }
    if(t[m].ax_add){
        add(m<<1,t[m].ax_add);
        add(m<<1|1,t[m].ax_add);
        t[m].ax_add=0;
    }
    return ;
}
void change_add(int m,int ll,int rr,int v){
    if(t[m].l>=ll&&t[m].r<=rr){
        add(m,v);
        return ;
    }
    spread(m);
    int mid=t[m].l+t[m].r>>1;
    if(mid>=ll) change_add(m<<1,ll,rr,v);
    if(mid<rr) change_add(m<<1|1,ll,rr,v);
    updata(m);
    return ;
}
void change_set(int m,int ll,int rr,int v){
    if(t[m].l>=ll&&t[m].r<=rr){
        set(m,v);
        return ;
    }
    spread(m);
    int mid=t[m].l+t[m].r>>1;
    if(mid>=ll) change_set(m<<1,ll,rr,v);
    if(mid<rr) change_set(m<<1|1,ll,rr,v);
    updata(m);
    return ;
}
long long ask_sum(int m,int ll,int rr){
    if(t[m].l>=ll&&t[m].r<=rr) return t[m].sum;
    spread(m);long long ans=0;
    int mid=t[m].l+t[m].r>>1;
    if(mid>=ll) ans+=ask_sum(m<<1,ll,rr);
    if(mid<rr) ans+=ask_sum(m<<1|1,ll,rr);
    return ans;
}
long long ask_minn(int m,int ll,int rr){
    if(t[m].l>=ll&&t[m].r<=rr) return t[m].minn;
    spread(m);
    long long ans=1e10+7;
    int mid=t[m].l+t[m].r>>1;
    if(mid>=ll) ans=min(ans,ask_minn(m<<1,ll,rr));
    if(mid<rr) ans=min(ans,ask_minn(m<<1|1,ll,rr));
    return ans;
}
long long ask_maxx(int m,int ll,int rr){
    if(t[m].l>=ll&&t[m].r<=rr) return t[m].maxx;
    spread(m);long long ans=-1e10+7;
    int mid=t[m].l+t[m].r>>1;
    if(mid>=ll) ans=max(ans,ask_maxx(m<<1,ll,rr));
    if(mid<rr) ans=max(ans,ask_maxx(m<<1|1,ll,rr));
    return ans;
}
int main(){
     scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++) scanf("%lld",&num[i]);
    build(1,1,n);
    while(q--){
        string s;
        cin>>s;
        if(s[1]=='d') scanf("%d%d%d",&x,&y,&z),change_add(1,x,y,z);
        if(s[1]=='e') scanf("%d%d%d",&x,&y,&z),change_set(1,x,y,z);
        if(s[1]=='u') scanf("%d%d",&x,&y),printf("%lld\n",ask_sum(1,x,y));
        if(s[1]=='a') scanf("%d%d",&x,&y),printf("%lld\n",ask_maxx(1,x,y));
        if(s[1]=='i') scanf("%d%d",&x,&y),printf("%lld\n",ask_minn(1,x,y));
    //  init();
    }
    return 0;
}
内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值