记得暑假的时候看《亚洲区预选赛真题题解》的时候,看到树状数组那道题,只是勉强看懂思路了!树状数组的结节根本就没有掌握。时隔四个月,再回头看这道题,感觉轻松多了!

对于hdu2492这道题,用树状数组是非常好的选择,代码短,结构简单,不易出错!

其核心的思路在于:假如有a1 a2 a3 a4 a5 a6 a7 a8 a9这段数据,我们枚举每个点,假如到了a4,那么我们需要知道的是:

a1 a2 a3中小于a4的有多少?

a5 a6 a7 8 a9中大于a4的有多少?

这里的统计就用到的树状数组!

把代码贴出来吧!

  1. #include<stdio.h>
  2. #include<string.h>
  3. #define MM 100000
  4. #define MN 20000
  5. int n;
  6. int a[MN+100],tree[2][MM+100];
  7. int left[MN+100],right[MN+100];
  8. void init(){
  9. memset(tree,0,sizeof(tree));
  10. memset(left,0,sizeof(left));
  11. memset(right,0,sizeof(right));
  12. }
  13. int lowbit(int x){
  14. return x&(-x);
  15. }
  16. void insert(int pos,int flag){
  17. while(pos<=MM){
  18. tree[flag][pos]++;
  19. pos+=lowbit(pos);
  20. }
  21. }
  22. int query(int pos,int flag){
  23. int ans=0;
  24. while(pos>0){
  25. ans+=tree[flag][pos];
  26. pos-=lowbit(pos);
  27. }
  28. return ans;
  29. }
  30. int main(){
  31. int t,i;
  32. scanf("%d",&t);
  33. while(t--){
  34. scanf("%d",&n);
  35. init();
  36. for(i=1;i<=n;i++){
  37. scanf("%d",&a[i]);
  38. }
  39. for(i=1;i<=n;i++){
  40. left[i]=query(a[i]-1,0);
  41. insert(a[i],0);
  42. }
  43. for(i=n;i>0;i--){
  44. right[i]=query(a[i]-1,1);
  45. insert(a[i],1);
  46. }
  47. long long ans=0;
  48. for(i=1;i<=n;i++){
  49. ans+=(long long)left[i]*(long long)(n-i-right[i])+(long long)(i-left[i]-1)*(long long)right[i];
  50. }
  51. printf("%I64d\n",ans);
  52. }
  53. return 0;
  54. }

用树状数组解决求统计问题:hdu2492相关推荐

  1. 用树状数组解决求区间最值的问题:hdu1754

    以前都学过树状数组,但是已经差不多忘记了!不过看一看后,马上就都回忆起来了!而且感觉经过这么久的学习,对树状数组有了更深一层的领悟!个人觉得树状数组在本质上与线段树是没有区别的!都是管理区间,只不过树 ...

  2. 树状数组(求子区间和+更新元素值)

    树状数组 欲完成修改值和查询区间和两种操作 求前缀和的做法时间复杂度为O(n)O(n)O(n) 使用树状数组时间复杂度降为O(logn)O(logn)O(logn) lowbit 1.x&(- ...

  3. 求序列最长不下降子序列_树状数组解决最长不下降子序列 讲讲主要思路就好...

    展开全部 不降子序列求的是一个元素的值单调e69da5e887aa62616964757a686964616f31333361306430不降的序列. 传统的状态设计便是使用f[n] 表示到达第n位时 ...

  4. 树状数组 _ 求逆序数

    注: 本文只是记录  ,您将从上面学习不到任何知识,除了 代码 (废话)第一次接触到树状数组,感觉接触到了新世界,理解这个思想用了好长时间,终于弄明白了(似懂非懂). 还有接触到了  离散化的思想, ...

  5. SPOJ D-query 树状数组离线 求区间内不同数字的个数

    Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query is a pair (i, j) (1 ...

  6. 树状数组(求逆序对)

    一.树状数组是什么 树状数组,又称二进制索引树,英文名Binary Indexed Tree 之前遇到一个求逆序对的题,看了很多题解都只说了这个树状数组,关于怎么实现的全都避而不谈,我研究了一下午,总 ...

  7. 逆序对(树状数组解决)

    传送门 Solution: 由于数字的大小可能非常大,而且都是未知的,所以只能采用离散化的方式先将数组离散化. 每次把这个数的位置加入到树状数组中,因为是排完序之后,所以之前加入的一定比后加入的大 然 ...

  8. 【DP】【树状数组】折线统计(金牌导航 数据结构优化DP-1)

    正题 金牌导航 数据结构优化DP-1 题目大意 平面上有n个点,让你选择若干点,连接x坐标相邻的点,其中连续上升或下降的为一段,问你有多少中选择方案,使得段数为k 解题思路 设fi,j,0/1f_{i ...

  9. 树状数组 + 离散化 求逆序对数量

    AcWing 788. 逆序对的数量 #include <bits/stdc++.h> using namespace std;typedef long long ll; const in ...

  10. 『柱状图 三分法求极值 树状数组』

    柱状图 Description WTH获得了一个柱状图,这个柱状图一共有N个柱子,最开始第i根柱子的高 度为xi,他现在要将这个柱状图排成一个屋顶的形状,屋顶的定义如下: 屋顶存在一个最高的柱子,假设 ...

最新文章

  1. 双电容单相电机接线图解_为什么单相电机要用电容,三相电机不需要?
  2. springBoot 在线心理咨询管理系统
  3. idea dump分析工具_实战:OOM 后我如何分析解决的
  4. 怎么去除桌面图标显示快捷方式字样?
  5. python 语言教程(3)变量
  6. 解决客户端从服务器请求数据乱码问题
  7. 在小范围内[打表]验证哥德巴赫猜想(洛谷P1579题题解,Java语言描述)
  8. Sublime Text3中 less 自动编译成 css 的方法
  9. mqtt 获取 状态_MQTT设备接入及上报数据的命令行模拟器(Java)
  10. c语言学习-将一个2*3的矩阵转置为3*2的矩阵
  11. 话说 Oracle ACE 这回事儿
  12. JAVA apidoc 官方文档下载地址
  13. Hibernate(1)
  14. UML-----实现图(构件图、部署图)
  15. 你会用计算机吗怎么写,你会用computer吗
  16. 水和水蒸气物性计算微信小程序
  17. 计算机专业的高考要考什么科,高考技术科目考什么内容
  18. AI面部修复项目:GFP-GAN
  19. 晚清时真正的武林高手在这儿?
  20. 分享一款轻量简洁的全平台开源商城系统

热门文章

  1. linux硬盘掉了,出了大问题,硬盘空间大量丢失
  2. 文件和参数一起上传_基于netty的文件上传下载组件
  3. 前牙正常覆盖是多少_深覆合千万不要矫正?用图示告诉你深覆合深覆盖的区别是什么,有什么危害...
  4. 计算机网络中什么是突发错,计算机网络基础习题(含答案)
  5. 自行车测速器怎么调_怎么测甲醛?
  6. python numpy array最大长度_python中找出numpy array数组的最值及其索引方法
  7. Python机器学习库——Sklearn
  8. 浅析2017快闪存储器涨势原因,AMOLED手机面板成主因?
  9. struts2 模型驱动封装
  10. 打字机游戏Ⅱ之手速pk