树状数组

作业介绍

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
int a[N],tree[N],n,m;
int lobit(int x) {
    //返回x中二进制最后一个1的位置
    return x&-x;
}
void add(int x,int c) {
    for (int i=x;i<=n;i+=lobit(i)) {
        tree[i]+=c;
    }
}
int query(int x) {
    //返回1~x的和
    int sum = 0;
    for (int i=x;i>=1;i-=lobit(i)) {
        sum+=tree[i];
    }
    return sum;
}
int main() {
    cin>>n>>m;
    for (int i=1;i<=n;i++) {
        cin>>a[i];
        add(i,a[i]);
    }
    while (m--) {
        int op,x,y,z;
        cin>>op>>x;
        if (op==1) {
            cin>>y;
            add(x,y);
        }
        else {
            cin>>y;
            cout<<query(y)-query(x-1)<<endl;
        }
    }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
int n,m,a[N],b[N],tree[N];
int lobit(int x) {
    return x&-x;
}
void add(int x,int c) {
    for (int i=x;i<=n;i+=lobit(i))tree[i]+=c;
}
int query(int x) {
    int sum = 0;
    for (int i=x;i>=1;i-=lobit(i)) {
        sum+=tree[i];
    }
    return sum;
}
int main() {
    cin>>n>>m;
    for (int i=1;i<=n;i++) {
        cin>>a[i];
        b[i] = a[i]-a[i-1];
    }
    for (int i=1;i<=n;i++) {
        add(i,b[i]);
    }
    while (m--) {
        int op,x,y,z;
        cin>>op;
        if (op==1) {
            cin>>x>>y>>z;
            add(x,z);
            add(y+1,-z);
        }
        else {
            cin>>x;
            cout<<query(x)<<endl;
        }
    }
    return 0;
}
/*
 * 离散化
 * 1 5 1000 100 3 60
 * 1 3 5 60 100 1000
 * 1 3 6 5 2 4
 */
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5+5;
int n,a[N],b[N],id[N],tree[N];
int lobit(int x) {
    return x&-x;
}
void add(int x,int c) {
    for (int i=x;i<=n;i+=lobit(i)) {
        tree[i]+=c;
    }
}
int query(int x) {
    int res = 0;
    for (int i=x;i>=1;i-=lobit(i)) {
        res+=tree[i];
    }
    return res;
}
signed main() {
    cin>>n;
    for (int i=1;i<=n;i++) {
        cin>>a[i];
        b[i] = a[i];
    }
    sort(b+1,b+n+1);
    for (int i=1;i<=n;i++) {
        //lower_bound 找第一个大于等于x的位置
        //upper_bound 找第一个大于x的位置
        id[i] = lower_bound(b+1,b+n+1,a[i])-b;
    }
    int res = 0;
    for (int i=n;i>=1;i--) {
        if (id[i]!=1)res+=query(id[i]-1);
        add(id[i],1);
    }
    cout<<res<<endl;
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+5,Mod=92084931;
int n,m,a[N],sum[N],tree[N];
struct node {
    int val,id;
}p[N];
bool cmp(node a,node b) {
    if (a.val==b.val)return a.id>b.id;
    return a.val<b.val;
}
int lobit(int x) {
    return x&-x;
}
void add(int x,int c) {
    for (int i=x;i<=n+1;i+=lobit(i)) {
        tree[i]+=c;
    }
}
int query(int x) {
    int res = 0;
    for (int i=x;i>=1;i-=lobit(i)) {
        res+=tree[i];res%=Mod;
    }
    return res%Mod;
}
signed main() {
    cin>>n>>m;
    p[0].id = 1;
    p[0].val = 0;
    for (int i=1;i<=n;i++) {
        cin>>a[i];
        p[i].val = p[i-1].val+a[i]-m;
        p[i].id = i+1;
    }
    sort(p,p+n+1,cmp);
    int res = 0;
    for (int i=0;i<=n;i++) {
        res+=query(p[i].id);res%=Mod;
        add(p[i].id,1);
    }
    cout<<res<<endl;
    return 0;
}
/*
 * 区间l~r数字的种类
 * query(r)前r个数字有多少种
 * 1~l-1  0
 * l~r    x
 * 维护x颜色最后一次出现的位置
 * l~r
 */
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
struct node {
    int l,r,id;
}p[N];
int n,m,a[N],lst[N],ans[N];
int tree[N];
int lobit(int x) {
    return x&-x;
}
void add(int x,int c) {
    for (int i=x;i<=1000000;i+=lobit(i)) {
        tree[i]+=c;
    }
}
int query(int x) {
    int res = 0;
    for (int i=x;i>=1;i-=lobit(i)) {
        res+=tree[i];
    }
    return res;
}
bool cmp(node a,node b) {
    if (a.r==b.r)return a.l<b.l;
    return a.r<b.r;
}
int main() {
    cin>>n;
    for (int i=1;i<=n;i++) {
        cin>>a[i];
    }
    cin>>m;
    for (int i=1;i<=m;i++) {
        cin>>p[i].l>>p[i].r;
        p[i].id = i;
    }
    sort(p+1,p+m+1,cmp);
    int r=0;
    for (int i=1;i<=m;i++) {
        while (r<p[i].r) {
            r++;
            if (!lst[a[r]]) {
                lst[a[r]] = r;
                add(r,1);
            }
            else {
                add(lst[a[r]],-1);
                lst[a[r]] = r;
                add(r,1);
            }
        }
        ans[p[i].id] = query(r)-query(p[i].l-1);
    }
    for (int i=1;i<=m;i++) {
        cout<<ans[i]<<endl;
    }
    return 0;
}
状态
已结束
题目
17
开始时间
2026-7-26 0:00
截止时间
2026-8-3 23:59
可延期
24 小时