用树状数组解决求统计问题:hdu2492
记得暑假的时候看《亚洲区预选赛真题题解》的时候,看到树状数组那道题,只是勉强看懂思路了!树状数组的结节根本就没有掌握。时隔四个月,再回头看这道题,感觉轻松多了!
对于hdu2492这道题,用树状数组是非常好的选择,代码短,结构简单,不易出错!
其核心的思路在于:假如有a1 a2 a3 a4 a5 a6 a7 a8 a9这段数据,我们枚举每个点,假如到了a4,那么我们需要知道的是:
a1 a2 a3中小于a4的有多少?
a5 a6 a7 8 a9中大于a4的有多少?
这里的统计就用到的树状数组!
把代码贴出来吧!
- #include<stdio.h>
- #include<string.h>
- #define MM 100000
- #define MN 20000
- int n;
- int a[MN+100],tree[2][MM+100];
- int left[MN+100],right[MN+100];
- void init(){
- memset(tree,0,sizeof(tree));
- memset(left,0,sizeof(left));
- memset(right,0,sizeof(right));
- }
- int lowbit(int x){
- return x&(-x);
- }
- void insert(int pos,int flag){
- while(pos<=MM){
- tree[flag][pos]++;
- pos+=lowbit(pos);
- }
- }
- int query(int pos,int flag){
- int ans=0;
- while(pos>0){
- ans+=tree[flag][pos];
- pos-=lowbit(pos);
- }
- return ans;
- }
- int main(){
- int t,i;
- scanf("%d",&t);
- while(t--){
- scanf("%d",&n);
- init();
- for(i=1;i<=n;i++){
- scanf("%d",&a[i]);
- }
- for(i=1;i<=n;i++){
- left[i]=query(a[i]-1,0);
- insert(a[i],0);
- }
- for(i=n;i>0;i--){
- right[i]=query(a[i]-1,1);
- insert(a[i],1);
- }
- long long ans=0;
- for(i=1;i<=n;i++){
- ans+=(long long)left[i]*(long long)(n-i-right[i])+(long long)(i-left[i]-1)*(long long)right[i];
- }
- printf("%I64d\n",ans);
- }
- return 0;
- }
用树状数组解决求统计问题:hdu2492相关推荐
- 用树状数组解决求区间最值的问题:hdu1754
以前都学过树状数组,但是已经差不多忘记了!不过看一看后,马上就都回忆起来了!而且感觉经过这么久的学习,对树状数组有了更深一层的领悟!个人觉得树状数组在本质上与线段树是没有区别的!都是管理区间,只不过树 ...
- 树状数组(求子区间和+更新元素值)
树状数组 欲完成修改值和查询区间和两种操作 求前缀和的做法时间复杂度为O(n)O(n)O(n) 使用树状数组时间复杂度降为O(logn)O(logn)O(logn) lowbit 1.x&(- ...
- 求序列最长不下降子序列_树状数组解决最长不下降子序列 讲讲主要思路就好...
展开全部 不降子序列求的是一个元素的值单调e69da5e887aa62616964757a686964616f31333361306430不降的序列. 传统的状态设计便是使用f[n] 表示到达第n位时 ...
- 树状数组 _ 求逆序数
注: 本文只是记录 ,您将从上面学习不到任何知识,除了 代码 (废话)第一次接触到树状数组,感觉接触到了新世界,理解这个思想用了好长时间,终于弄明白了(似懂非懂). 还有接触到了 离散化的思想, ...
- 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 ...
- 树状数组(求逆序对)
一.树状数组是什么 树状数组,又称二进制索引树,英文名Binary Indexed Tree 之前遇到一个求逆序对的题,看了很多题解都只说了这个树状数组,关于怎么实现的全都避而不谈,我研究了一下午,总 ...
- 逆序对(树状数组解决)
传送门 Solution: 由于数字的大小可能非常大,而且都是未知的,所以只能采用离散化的方式先将数组离散化. 每次把这个数的位置加入到树状数组中,因为是排完序之后,所以之前加入的一定比后加入的大 然 ...
- 【DP】【树状数组】折线统计(金牌导航 数据结构优化DP-1)
正题 金牌导航 数据结构优化DP-1 题目大意 平面上有n个点,让你选择若干点,连接x坐标相邻的点,其中连续上升或下降的为一段,问你有多少中选择方案,使得段数为k 解题思路 设fi,j,0/1f_{i ...
- 树状数组 + 离散化 求逆序对数量
AcWing 788. 逆序对的数量 #include <bits/stdc++.h> using namespace std;typedef long long ll; const in ...
- 『柱状图 三分法求极值 树状数组』
柱状图 Description WTH获得了一个柱状图,这个柱状图一共有N个柱子,最开始第i根柱子的高 度为xi,他现在要将这个柱状图排成一个屋顶的形状,屋顶的定义如下: 屋顶存在一个最高的柱子,假设 ...
最新文章
- 双电容单相电机接线图解_为什么单相电机要用电容,三相电机不需要?
- springBoot 在线心理咨询管理系统
- idea dump分析工具_实战:OOM 后我如何分析解决的
- 怎么去除桌面图标显示快捷方式字样?
- python 语言教程(3)变量
- 解决客户端从服务器请求数据乱码问题
- 在小范围内[打表]验证哥德巴赫猜想(洛谷P1579题题解,Java语言描述)
- Sublime Text3中 less 自动编译成 css 的方法
- mqtt 获取 状态_MQTT设备接入及上报数据的命令行模拟器(Java)
- c语言学习-将一个2*3的矩阵转置为3*2的矩阵
- 话说 Oracle ACE 这回事儿
- JAVA apidoc 官方文档下载地址
- Hibernate(1)
- UML-----实现图(构件图、部署图)
- 你会用计算机吗怎么写,你会用computer吗
- 水和水蒸气物性计算微信小程序
- 计算机专业的高考要考什么科,高考技术科目考什么内容
- AI面部修复项目:GFP-GAN
- 晚清时真正的武林高手在这儿?
- 分享一款轻量简洁的全平台开源商城系统
热门文章
- linux硬盘掉了,出了大问题,硬盘空间大量丢失
- 文件和参数一起上传_基于netty的文件上传下载组件
- 前牙正常覆盖是多少_深覆合千万不要矫正?用图示告诉你深覆合深覆盖的区别是什么,有什么危害...
- 计算机网络中什么是突发错,计算机网络基础习题(含答案)
- 自行车测速器怎么调_怎么测甲醛?
- python numpy array最大长度_python中找出numpy array数组的最值及其索引方法
- Python机器学习库——Sklearn
- 浅析2017快闪存储器涨势原因,AMOLED手机面板成主因?
- struts2 模型驱动封装
- 打字机游戏Ⅱ之手速pk