一维树状数组基本构造:
一维树状数组

相关习题: http://acm.pku.edu.cn/JudgeOnline/problem?id=2352

树状数组可以用来求逆序数, 当然一般用归并求。
如果数据不是很大, 可以一个个插入到树状数组中, 每插入一个数, 统计
比他小的数的个数,对应的逆序为 i- getsum( data[i] ),其中 i 为当前已
经插入的数的个数, getsum( data[i] )为比 data[i] 小的数的个数
i- sum( data[i] ) 即比 data[i] 大的个数, 即逆序的个数
但如果数据比较大,就必须采用离散化方法。

一关键字的离散化方法:

所谓离散化也就是建立一个一对一的映射。 因为求逆序时只须要求数据的相应
大小关系不变。
如: 10 30 20 40 50  与  1 3 2 4 5 的逆序数是相同的

定义一个结构体  struct Node{ int data;    // 对应数据
                                                   int pos;     // 数据的输入顺序 };
先对 data 升序排序, 排序后,pos 值对应于排序前 data 在数组中的位置。
再定义一个数组 p[N], 这个数组为原数组的映射。以下语句将按大小关系
把原数组与 1到 N 建立一一映射。

int id= 1; p[ d[1].pos ]= 1;
for( int i= 2; i<= n; ++i )
if( d[i].data== d[i-1].data ) p[ d[i].pos ]= id;
else                                    p[ d[i].pos ]= ++id;

相关习题:http://acm.pku.edu.cn/JudgeOnline/problem?id=2299

poj 2298


二关健字的离散方法:

先对第一个关键字进行离散化,然后对第二关键字排序。

相关习题:
http://acm.hnu.cn:8080/online/?action=problem&type=show&id=10069&courseid=0


二维树状数组

基本构造:


相关习题: http://acm.pku.edu.cn/JudgeOnline/problem?id=3321

posted on 2009-04-10 15:01 Darren 阅读(488) 评论(1)  编辑 收藏 引用

评论:
# re: 有关树状数组[未登录] 2009-08-22 10:52 | SImon
请教一个问题
那个3321你是怎么转换到二维坐标的阿 ?  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理