线段树

[原创] 树状数组的基本讲解

2020-02-27  本文已影响0人  Eromanga_Sensei
Powered by hjfzzm
Eromanga_Sensei——Izumi Sagiri
树状数组
int lowbit(int x) {
    return x & (x ^ (x – 1));
}
//或者
int lowbit(int x) {
    return x & -x;
}

int getsum(int x) {
    int res = 0;
    for (; x; x -= x & (-x))
        res += t[x];
    return res;
}
int change(int x) {
     for (; x <= maxn; x += x & (-x))
         t[x]++;
}

#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100100;
int C[MAX_N];
int n;
int lowbit(int x) {
    return x & (-x);
}
int getsum(int x) {
    int res = 0;
    for(; x; x -= lowbit(x)) {
        res += C[x];
    }
    return res;
}
void change(int x, int c) {
    for(; x <= MAX_N; x += x & (-x)) {
        C[x] += c;
    }
}
int main() {
    cin >> n;
    memset(C, 0, sizeof(C));
    for(int i = 1; i <= n; i++) {
        int d;
        cin >> d;
        change(i, d);
    }
    for(int i = 1; i <= n; i++) {
        cout << getsum(i) << " ";
    }
    return 0;
}

输入:
3
1 1
1 2
1 3
输出:
3 2 1

#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100100;
int C[MAX_N];
int n;
int lowbit(int x) {
    return x & (-x);
}
int getsum(int x) {
    int res = 0;
    for(; x; x -= lowbit(x)) {
        res += C[x];
    }
    return res;
}
void change(int x, int c) {
    for(; x <= MAX_N; x += x & (-x)) {
        C[x] += c;
    }
}
int main() {
    cin >> n;
    memset(C, 0, sizeof(C));
    for(int i = 1; i <= n; i++) {
        int p, q;
        cin >> p >> q;
        change(p, 1);
        change(q + 1, -1);
    }
    for(int i = 1; i < n; i++) {
        cout << getsum(i) << " ";
    }
    cout << getsum(n) << endl;
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读