树状数组(2019.7.22训练)

洛谷 P3374 【模板】树状数组 1

单点修改,区间查询和。

#include <bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n,m,x,y,opt,a[N];
void update(int i,int v)
{
    while(i<=n)
    {
        a[i]=a[i]+v;
        i=i+(i&-i);
    }
}
int sum(int i)
{
    int s=0;
    while(i)
    {
        s=s+a[i];
        i=i-(i&-i);
    }
    return s;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        update(i,x);
    }
    while(m--)
    {
        cin>>opt>>x>>y;
        if(opt==1)update(x,y);
        else printf("%d\n",sum(y)-sum(x-1));
    }
    return 0;
}

洛谷 P3368 【模板】树状数组 2

区间修改,单点查询。维护差分数组即可。

#include <bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n,m,x,y,k,opt,a[N],ans[N];//原数组为a[i],其差分数组保存在树状数组ans[i]中
void update(int i,int v)
{
    while(i<=n)
    {
        ans[i]=ans[i]+v;
        i=i+(i&-i);
    }
}
int sum(int i)
{
    int s=0;
    while(i)
    {
        s=s+ans[i];
        i=i-(i&-i);
    }
    return s;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        x=a[i]-a[i-1];//求差分
        update(i,x);
    }
    while(m--)
    {
        cin>>opt;
        if(opt==1)
        {
            cin>>x>>y>>k;
            update(x,k);
            update(y+1,-k);
        }
        else
        {
            cin>>x;
            printf("%d\n",sum(x));
        }
    }
    return 0;
}
全部评论

相关推荐

05-16 11:16
已编辑
东华理工大学 Java
牛客73769814...:盲猜几十人小公司,庙小妖风大,咋不叫她去4️⃣呢😁
牛客创作赏金赛
点赞 评论 收藏
分享
07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务