线段树模板

本文提供了一个线段树的数据结构模板,支持区间加法及区间求和操作,并附带了完整的C++代码实现。适用于解决涉及区间修改和查询的问题。

线段树模板

可实现区间加法,区间求和。

具体看代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#define max 1000001
#define ll long long 
using namespace std;
unsigned ll n,m,a[max],ans[max*4],tag[max*4];
inline void fix(ll p)
{
    ans[p]=ans[p<<1]+ans[p<<1|1];
    //由于是这个区间统一改变,所以ans数组要加元素个数次啦
    //就是记录当前节点所代表的区间
}
void build(ll p,ll l,ll r)
{
    tag[p]=0;
    if(l==r)
    {
        ans[p]=a[l];
        return ;
    }
    ll mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    fix(p);
}
inline void f(ll p,ll l,ll r,ll k)
{
    tag[p]+=k;
    ans[p]+=k*(r-l+1);
}
inline void pushdown(ll p,ll l,ll r)
{
    ll mid=(l+r)>>1;
    f(p<<1,l,mid,tag[p]);
    f(p<<1|1,mid+1,r,tag[p]);
    tag[p]=0;
}
inline void update(ll nl,ll nr,ll l,ll r,ll p,ll k)//区间加法 
{
    //nl,nr为要修改的区间
    //l,r,p为当前节点所存储的区间以及节点的编号
    if(nl<=l&&nr>=r)
    {
        ans[p]+=k*(r-l+1);
        tag[p]+=k;
        return ;
    }
    pushdown(p,l,r);
    ll mid=(l+r)>>1;
    if(nl<=mid) update(nl,nr,l,mid,p<<1,k);
    if(nr>mid) update(nl,nr,mid+1,r,p<<1|1,k);
    fix(p);
}
ll query(ll nl,ll nr,ll l,ll r,ll p)//区间查询 
{
    //nl,nr为要修改的区间
    //l,r,p为当前节点所存储的区间以及节点的编号
    ll res=0;
    if(nl<=l&&nr>=r) return ans[p];
    ll mid=(l+r)>>1;
    pushdown(p,l,r);
    if(nl<=mid) res+=query(nl,nr,l,mid,p<<1);
    if(nr>mid) res+=query(nl,nr,mid+1,r,p<<1|1);
    return res;
}
int main()
{
    ll b,c,d,e,f;
    scanf("%lld%lld",&n,&m);
    for(unsigned int i=1;i<=n;i++)
      scanf("%lld",&a[i]);
    build(1,1,n);
    while(m--)
    {
        ll g;
        scanf("%lld",&g);
        switch(g)
        {
            case 1://区间加法 
            {
                scanf("%lld%lld%lld",&b,&c,&d);
                update(b,c,1,n,1,d);
                break;
            }
            case 2://区间求和 
            {
                scanf("%lld%lld",&e,&f);
                printf("%lld\n",query(e,f,1,n,1));
                break;
            }
        }    
    }
    return 0;
}

本文参考https://pks-loving.blog.luogu.org/senior-data-structure-qian-tan-xian-duan-shu-segment-tree

转载于:https://www.cnblogs.com/mxrmxr/p/9677390.html

系统支持前后端分离架构,涵盖微信、支付宝、百度、头条等主流平台的小程序、APP及公众号,内置多种常见支付方式,具备完善的订单处理机制,界面设计美观,是一款功能完备的商城开源平台。毕业设计是高校教育中的一项关键实践性任务,用于评估学生在专业领域内的知识掌握程度、实践能力和创新思维。该任务通常要求学生结合所学理论,针对某一具体问题提出可行的解决方案或开展一项具有实际价值的研究项目。 在选题阶段,学生需根据个人兴趣、专业方向及现实需求进行选择,并在导师指导下明确研究目标与核心问题,制定研究计划与实施方案。整个过程通常包含资料查阅、需求分析、系统设计、开发实现及测试优化等多个环节,确保研究的完整性与科学性。 在研究过程中,学生需具备较强的自主分析与问题解决能力,可能通过实验、调研、案例研究等方式收集数据并验证假设,从而提升专业技能与实际操作能力。撰写毕业设计报告是核心环节之一,需详细记录研究过程、方法、结果及结论,以全面展示研究成果。同时,这一过程也有助于提升学生的学术表达能力与逻辑思维水平。 最终,毕业设计成果将由导师及相关专家进行评审,评价标准涵盖创新性、应用价值、研究方法的合理性及论文撰写质量等方面。毕业设计的成绩将作为学生学业评估的重要依据,直接影响其毕业资格与学位授予。 总体而言,毕业设计是高校教学体系中的重要组成部分,不仅有助于学生深化专业知识,还能锻炼其独立研究与实践能力,为未来职业发展奠定良好基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值