树状数组

树状数组

图片说明

点修改区间查询

P3374 【模板】树状数组 1
1.将某一个数加上x
2.求出某区间每一个数的和

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = -1e9;
const ll N =5e5+7;
const ll mod=1e9+7;
inline ll read() { ll s = 0, w = 1; char ch = getchar(); while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }    while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar(); return s * w; }
inline void write(ll x) { if (!x) { putchar('0'); return; } char F[200]; ll tmp = x > 0 ? x : -x; if (x < 0)putchar('-'); int cnt = 0;    while (tmp > 0) { F[cnt++] = tmp % 10 + '0';     tmp /= 10; }    while (cnt > 0)putchar(F[--cnt]); }
inline ll gcd(ll x, ll y) { return y ? gcd(y, x % y) : x; }
ll qpow(ll a, ll b) { ll ans = 1;   while (b) { if (b & 1)  ans *= a;b >>= 1;a *= a; }   return ans; }   ll qpow(ll a, ll b, ll mod) { ll ans = 1; while (b) { if (b & 1)(ans *= a) %= mod; b >>= 1; (a *= a) %= mod; }return ans % mod; }
ll getinv(ll x){return qpow(x,mod-2,mod);}
int n,a[N],m;
inline int lowbit(int x){
    return x&-x;
}
void add(int i,int val){
    while(i<=n){
        a[i]+=val;
        i+=lowbit(i);
    }
}
int sum(int i){
    int sum=0;
    while(i>0){
        sum+=a[i];
        i-=lowbit(i);
    }
    return sum;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        int val=read();
        add(i,val);
    }
    for(int i=1;i<=m;i++){
        int op,l,r;
        scanf("%d",&op);
        if(op==1){
            int pos,val;
            scanf("%d%d",&pos,&val);
            add(pos,val);
        }
        else if(op==2){
            int l,r;
            scanf("%d%d",&l,&r);
            printf("%d\n",sum(r)-sum(l-1));    
        }
    }
    return 0;
}

区间修改,区间查询

1.将某区间每一个数数加上x;
2.求出某一个数的值。
P3368 【模板】树状数组 2

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = -1e9;
const ll N =5e5+7;
const ll mod=1e9+7;
inline ll read() { ll s = 0, w = 1; char ch = getchar(); while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }    while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar(); return s * w; }
inline void write(ll x) { if (!x) { putchar('0'); return; } char F[200]; ll tmp = x > 0 ? x : -x; if (x < 0)putchar('-'); int cnt = 0;    while (tmp > 0) { F[cnt++] = tmp % 10 + '0';     tmp /= 10; }    while (cnt > 0)putchar(F[--cnt]); }
inline ll gcd(ll x, ll y) { return y ? gcd(y, x % y) : x; }
ll qpow(ll a, ll b) { ll ans = 1;   while (b) { if (b & 1)  ans *= a;b >>= 1;a *= a; }   return ans; }   ll qpow(ll a, ll b, ll mod) { ll ans = 1; while (b) { if (b & 1)(ans *= a) %= mod; b >>= 1; (a *= a) %= mod; }return ans % mod; }
ll getinv(ll x){return qpow(x,mod-2,mod);}
ll n,a[N],m;
inline int lowbit(int x){
    return x&-x;
}
void add(int i,int val){
    while(i<=n){
        a[i]+=val;
        i+=lowbit(i);
    }
}
int sum(int i){
    int sum=0;
    while(i>0){
        sum+=a[i];
        i-=lowbit(i);
    }
    return sum;
}
int main(){
    cin>>n>>m;
    ll last=0,now;
    for(int i=1;i<=n;i++){
        now=read();
        add(i,now-last);
        last=now;
    }
    for(int i=1;i<=m;i++){
        int op;
        scanf("%d",&op);
        if(op==1){
            int l,r,k;
            scanf("%d%d%d",&l,&r,&k);
            add(l,k);
            add(r+1,-k);
        }
        else if(op==2){
            int k;
            scanf("%d",&k);
            printf("%lld\n",sum(k));
        }
    }
    return 0;
}
全部评论

相关推荐

挣K存W养DOG:玩小红书玩的,觉得自己很幽默😅
点赞 评论 收藏
分享
03-25 17:53
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务