当前位置:   article > 正文

树状数组初学(1)——位置i左(右)边小于a[i]的个数_怎么找 1~i 中又多少个数小于 a[i]?

怎么找 1~i 中又多少个数小于 a[i]?
  1. /*树状数组案例:
  2. 给出数组a[1], a[2], ... , a[n]
  3. 输出数组ans[1], ans[2], ... , ans[n] 满足
  4. ans[i](0 < i <= n)的值是集合{a[j] | 0 < j < i 且 a[j] < a[i])}
  5. 所包含的元素的个数*/
  6. #include <stdio.h>
  7. #define N 1000
  8. int a[N+10], n;
  9. int ans[N+10], tree[N+10];
  10. void update(int x, int value);
  11. int getsum(int x);
  12. int main()
  13. {
  14. int i, j;
  15. scanf("%d", &n);
  16. for (i = 1; i <= n; i++)
  17. scanf("%d", &a[i]);
  18. /*核心部分*/
  19. for (i = 1; i <= n; i++) {
  20. /*如果是统计位置i右边小于a[i]的个数
  21. 循环改写为for (i = n; i >= 1; i--)即可*/
  22. ans[i] = getsum(a[i]);
  23. update(a[i], 1);
  24. }
  25. for (i = 1; i <= n; i++)
  26. printf("%d ", ans[i]);
  27. printf("\n");
  28. return 0;
  29. }
  30. void update(int x, int value)
  31. {
  32. while (x <= N) {
  33. tree[x] += value;
  34. x += x & (-x);
  35. }
  36. return
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号