算法提高之楼兰图腾(树状数组)

楼兰图腾(树状数组)

  • 核心算法:树状数组

    • 将下标转化为二进制 例如11100100 父节点下标x 子节点下标i
      • 由下图可知 每一个数都可以由其子节点**(如果有)**求和得到
      • **由父节点找子节点:**每个子节点下标 –> x – 1 – lowbit(x – 1)
      • 由子节点找父节点: i + lowbit(i)
    • 在这里插入图片描述
  •   #include <cstdio>
      #include <cstring>
      #include <iostream>
      #include <algorithm>
      
      using namespace std;
      typedef long long LL;
      const int N = 200010;
      
      int Greater[N],lower[N];
      int a[N];
      int tr[N];
      int n;
      
      int lowbit(int x)
      {
          return x&-x;  //取最后一位1
      }
      
      void add(int x,int c)
      {
          for(int i=x;i<=n;i += lowbit(i)) tr[i] += c;  //在每一个父节点上都加上c
      } 
      
      int sum(int x)
      {
          int res=0;
          for(int i=x;i;i -= lowbit(i)) res+=tr[i];  //所有子节点求和
          return res;
      }
      
      int main()
      {
          cin>>n;
          for(int i=1;i<=n;i++) cin>>a[i];
          
          for(int i=1;i<=n;i++)
          {
              int y = a[i];
              Greater[i] = sum(n) - sum(y);  //前缀和 求值为y-n的个数
              lower[i] = sum(y-1);  //0-(y-1)的个数
              //解释:大小为y的有1个
              add(y,1);  //值作为下标 个数作为值 存入树状数组
          }
          //清空之前的树
          memset(tr,0,sizeof tr);
          LL res1=0,res2=0;
          for(int i=n;i;i--)
          {
              int y = a[i];
              //Greater里面存的是左边大的 再求一个右边大的
              res1 += Greater[i] * (LL)(sum(n) - sum(y));  
              res2 += lower[i] * (LL)(sum(y-1));
              //一样的操作建树
              add(y,1);
          }
          cout<<res1<<" "<<res2;
      }
    

参考题解:https://www.acwing.com/solution/content/110791/

相关推荐

  1. C语言-算法-树状数组

    2024-03-14 04:04:02       50 阅读
  2. 算法提高热浪

    2024-03-14 04:04:02       29 阅读
  3. 算法提高货币系统

    2024-03-14 04:04:02       28 阅读
  4. 算法提高小国王

    2024-03-14 04:04:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 04:04:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 04:04:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 04:04:02       82 阅读
  4. Python语言-面向对象

    2024-03-14 04:04:02       91 阅读

热门阅读

  1. Unity3D 动态生成场景管理节点详解

    2024-03-14 04:04:02       44 阅读
  2. Hive函数 EXPLODE 和 POSEXPLODE 使用示例

    2024-03-14 04:04:02       41 阅读
  3. 记录一次大厂面试题

    2024-03-14 04:04:02       43 阅读
  4. 嵌入式学习日记 27

    2024-03-14 04:04:02       42 阅读
  5. C后端开发,记录一个关于条件变量的死锁bug

    2024-03-14 04:04:02       41 阅读
  6. 动态导入图片

    2024-03-14 04:04:02       43 阅读
  7. 大模型prompt-文章生成

    2024-03-14 04:04:02       49 阅读
  8. LeetCode[题解] 2864. 最大二进制奇数

    2024-03-14 04:04:02       41 阅读
  9. 蓝桥杯:货物摆放

    2024-03-14 04:04:02       48 阅读
  10. 蓝桥杯冲刺_二分(正在补题)

    2024-03-14 04:04:02       110 阅读
  11. 程序员如何选择职业赛道?

    2024-03-14 04:04:02       41 阅读
  12. WebGL开发数字孪生系统

    2024-03-14 04:04:02       48 阅读