• 简述树状数组


    树状数组可以解决大部分区间上面的修改以及查询的问题,例如1.单点修改,单点查询,2.区间修改,单点查询,3.区间查询,区间修改,换言之,线段树能解决的问题,树状数组大部分也可以。

     其修改和查询都是log级别的

    树状数组的核心操作主要是修改单点和查询区间和

    1. int tree[N];
    2. int arr[N];
    3. int lowbit(int k) {
    4. return k & -k;
    5. }
    6. void add_singleP(int pos, int k) {//一个点值增加,与其相关的父节点也修改
    7. for (int j = pos; j <= n; j += lowbit(j)) {
    8. tree[j] += k;
    9. }
    10. }
    11. inline int sumPre(int pos) {//得到区间[0,pos]前缀和
    12. int ans = 0;
    13. for (int j = pos; j != 0; j -= lowbit(j)) {
    14. ans += tree[j];
    15. }
    16. return ans;
    17. }
    18. inline int queryLR(int l, int r) {
    19. return sumPre(r) - sumPre(l - 1);
    20. }

     将树状数组当成差分数组来看,修改区间和查询单点(差分的前缀和)

    1. #include
    2. using namespace std;
    3. #define int long long
    4. #define rep(j,b,e) for(int j=(b);j<=(e);j++)
    5. #define drep(j,e,b) for(int j=(e);j>=(b);j--)
    6. const int N = 5e5 + 10;
    7. int n, m, q, k;
    8. int tree[N];
    9. int arr[N];
    10. int lowbit(int k) {
    11. return k & -k;
    12. }
    13. void add_singleP(int pos, int k) {//一个点值增加,与其相关的父节点也修改
    14. for (int j = pos; j <= n; j += lowbit(j)) {
    15. tree[j] += k;
    16. }
    17. }
    18. inline int sumPre(int pos) {//得到区间[0,pos]前缀和
    19. int ans = 0;
    20. for (int j = pos; j != 0; j -= lowbit(j)) {
    21. ans += tree[j];
    22. }
    23. return ans;
    24. }
    25. inline int queryLR(int l, int r) {
    26. return sumPre(r) - sumPre(l - 1);
    27. }
    28. signed main() {
    29. #ifndef ONLINE_JUDGE
    30. //freopen("out.txt", "w", stdout);
    31. #endif
    32. ios::sync_with_stdio(0); cout.tie(0);
    33. cin >> n >> m;
    34. rep(j, 1, n) {
    35. cin >> arr[j];
    36. add_singleP(j, arr[j] - arr[j - 1]);//树状数组元素作为差分
    37. }
    38. rep(j, 1, m) {
    39. int choice, x, y, k;
    40. cin >> choice;
    41. if (choice == 1) {
    42. cin >> x >> y >> k;
    43. add_singleP(x, k);
    44. add_singleP(y + 1, -k);//模拟差分标记区间
    45. }
    46. else {
    47. cin >> x;
    48. cout << sumPre(x) << endl;//差分的前缀和为该点的值
    49. }
    50. }
    51. }

     树状数组求解逆序数,思路在注释。主要是离散化数组后,将数组元素当作树状数组下标利用树状数组每次统计比当前元素大有几个。,并记录求和。答案则为逆序数

    1. #include
    2. using namespace std;
    3. #define int long long
    4. #define rep(j,b,e) for(int j=(b);j<=(e);j++)
    5. #define drep(j,e,b) for(int j=(e);j>=(b);j--)
    6. const int N = 5e5 + 10;
    7. int n, m, q, k;
    8. int tree[N];
    9. struct node {
    10. int val, id;
    11. };
    12. node arr[N];
    13. int ranks[N];
    14. int lowbit(int k) {
    15. return k & -k;
    16. }
    17. void add_singleP(int pos, int k) {//一个点值增加,与其相关的父节点也修改
    18. for (int j = pos; j <= n; j += lowbit(j)) {
    19. tree[j] += k;
    20. }
    21. }
    22. inline int sumPre(int pos) {//得到区间[0,pos]前缀和
    23. int ans = 0;
    24. for (int j = pos; j != 0; j -= lowbit(j)) {
    25. ans += tree[j];
    26. }
    27. return ans;
    28. }
    29. inline int queryLR(int l, int r) {
    30. return sumPre(r) - sumPre(l - 1);
    31. }
    32. signed main() {
    33. #ifndef ONLINE_JUDGE
    34. //freopen("out.txt", "w", stdout);
    35. #endif
    36. ios::sync_with_stdio(0); cout.tie(0);
    37. cin >> n;
    38. rep(j, 1, n) {
    39. cin >> arr[j].val;
    40. arr[j].id = j;
    41. }
    42. int ans = 0;
    43. //--离散化
    44. stable_sort(arr + 1, arr + 1 + n, [](node a, node b) {
    45. if (a.val != b.val)
    46. return a.val > b.val;
    47. return a.id > b.id;//保证靠后的相同数不会把靠前的相同数当逆序
    48. });
    49. rep(j, 1, n) {
    50. ranks[arr[j].id] = j;//离散化
    51. }
    52. //--
    53. rep(j, 1, n) {//更大的数字先入树状数组,每次统计前面有几个比自己大的
    54. int x = ranks[j];
    55. add_singleP(x, 1);
    56. ans += sumPre(x - 1);
    57. }
    58. cout << ans;
    59. }

  • 相关阅读:
    【后端开发实习】用Nodejs操作mongodb结合Mongoose实现数据库操作
    JAVA系列之类加载机制详解
    可拖动、可靠边的 popupWindow 实现
    【Yocto1】构建嵌入式Linux系统
    remount of the / superblock failed: Permission denied remount failed
    Matlab:特征值
    Flink作业执行之 2.算子 StreamOperator
    5.11-5.12Union-Find算法详解
    Android 9.0 屏蔽设备的WLAN功能
    【计算机毕设之基于Java的高校毕业生就业质量数据分析系统-哔哩哔哩】 https://b23.tv/3T9UIrM
  • 原文地址:https://blog.csdn.net/m0_60777643/article/details/126149071