树状数组小结

单点修改&区间查询

最普通的树状数组
实现用lowbitlowbitlowbit的优秀性质
原理很简单


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 500005
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
#define O3 __attribute__((optimize("-O3")))

using namespace std;

ll a[MAXN],tr[MAXN];
ll n,m;

O3 inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
    while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
O3 inline ll lowbit(ll x)
{
    return x&(-x);
}
O3 inline void add(ll x,ll y)
{
    while (x<=n)tr[x]+=y,x+=lowbit(x);
}
O3 inline ll query(ll x)
{
    ll y=0;
    while (x)y+=tr[x],x-=lowbit(x);
    return y;
}
O3 inline ll ask(ll x,ll y)
{
    return query(y)-query(x-1);
}
O3 int main()
{
    //freopen("readin.txt","r",stdin);
    n=read(),m=read();
    fo(i,1,n)a[i]=read(),add(i,a[i]);
    while (m--)
    {
        ll z=read(),x=read(),y=read();
        if (z==1)add(x,y);
        else printf("%lld\n",ask(x,y));
    }
    return 0;
}

区间修改&单点查询

实现这个的思路比较巧妙
做一个差分,设b[i]=a[i]−a[i−1]b[i]=a[i]-a[i-1]b[i]=a[i]a[i1],那么∑i=1nb[i]=a[i]\sum^n_{i=1}b[i]=a[i]i=1nb[i]=a[i]
那么对于一个区间的修改[x,y][x,y][x,y]区间加kkk,相当于xxx位加kkky+1y+1y+1位减kkk
容易知道这是对的,在xxx前没有影响,从xxx开始才有贡献
用树状数组维护bbb就好了


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 500005
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;++i)
#define O3 __attribute__((optimize("-O3")))

ll a[MAXN],tr[MAXN];
ll n,m;

O3 inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
    while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
O3 inline ll lowbit(ll x)
{
    return x&(-x);
}
O3 inline void change(ll x,ll y)
{
    while (x<=n)tr[x]+=y,x+=lowbit(x);
}
O3 inline ll query(ll x)
{
    ll y=0;
    while (x)y+=tr[x],x-=lowbit(x);
    return y;
}
O3 int main()
{
    //freopen("readin.txt","r",stdin);
    n=read(),m=read();
    fo(i,1,n)a[i]=read(),change(i,a[i]-a[i-1]);
    while (m--)
    {
        ll z=read(),x,y;
        if (z==1)
        {
            x=read(),y=read(),z=read();
            change(x,z),change(y+1,-z);
        }
        else printf("%lld\n",query(read()));
    }
    return 0;
}

伪线段树树状数组

其实这个就是支持区间修改和区间查询的树状数组
对于一段区间查询[x,y][x,y][x,y],拆成[1,x−1][1,x-1][1,x1][1,y][1,y][1,y],单独考虑[1,x][1,x][1,x]的答案即可

  • 那么ans=∑i=1xa[i]=a[1]+a[2]+a[3]+...+a[x]ans=\sum^x_{i=1}a[i]=a[1]+a[2]+a[3]+...+a[x]ans=i=1xa[i]=a[1]+a[2]+a[3]+...+a[x]

  • =(b[1])+(b[1]+b[2])+(b[1]+b[2]+b[3])+...+(b[1]+b[2]+b[3]...+b[x])=(b[1])+(b[1]+b[2])+(b[1]+b[2]+b[3])+...+(b[1]+b[2]+b[3]...+b[x])=(b[1])+(b[1]+b[2])+(b[1]+b[2]+b[3])+...+(b[1]+b[2]+b[3]...+b[x])

  • =b[1]∗x+b[2]∗(x−1)+b[3]∗(x−2)+...+b[x]=b[1]*x+b[2]*(x-1)+b[3]*(x-2)+...+b[x]=b[1]x+b[2](x1)+b[3](x2)+...+b[x]

  • =x(b[1]+b[2]+b[3]+...+b[x])−(b[1]∗0+b[2]∗1+b[3]∗2+...+b[x]∗(x−1))=x(b[1]+b[2]+b[3]+...+b[x])-(b[1]*0+b[2]*1+b[3]*2+...+b[x]*(x-1))=x(b[1]+b[2]+b[3]+...+b[x])(b[1]0+b[2]1+b[3]2+...+b[x](x1))

再设一个ccc数组,使c[i]=b[i]∗(i−1)c[i]=b[i]*(i-1)c[i]=b[i](i1)
那么[1,x][1,x][1,x]的和即为x∗query(b,x)−query(c,x)x*query(b,x)-query(c,x)xquery(b,x)query(c,x)


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 500005
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;++i)
#define O3 __attribute__((optimize("-O3")))

ll a[MAXN],tr[MAXN],tr1[MAXN];
ll n,m;

O3 inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
    while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
O3 inline ll lowbit(ll x)
{
    return x&(-x);
}
O3 inline void change(ll *tr,ll x,ll y)
{
    while (x<=n)tr[x]+=y,x+=lowbit(x);
}
O3 inline ll query(ll *tr,ll x)
{
    ll y=0;
    while (x)y+=tr[x],x-=lowbit(x);
    return y;
}
O3 int main()
{
    //freopen("readin.txt","r",stdin);
    n=read(),m=read();
    fo(i,1,n)a[i]=read(),change(tr,i,a[i]-a[i-1]),change(tr1,i,(a[i]-a[i-1])*(i-1));
    while (m--)
    {
        ll z=read(),x,y;
        if (z==1)
        {
            x=read(),y=read(),z=read();
            change(tr,x,z),change(tr,y+1,-z);
            change(tr1,x,z*(x-1)),change(tr1,y+1,-z*y);
        }
        else x=read(),y=read(),
        printf("%lld\n",(y*query(tr,y)-(x-1)*query(tr,x-1))-(query(tr1,y)-query(tr1,x-1)));
    }
    return 0;
}
**项目名称:** 基于Vue.js与Spring Cloud架构的博客系统设计与开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学与技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存与会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署与运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户与内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发与部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡与熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值