随笔分类 -  数据结构

摘要:离散化,但数据范围太大是所借用的利器,举个例子,有四个数99999999 1 123 1583 数据范围太大,而树状数组中的c数组开的范围是数据的范围,这时候就需要离散化,把四个数一次标号为1 2 3 4(即第一个数,第二个数。。。),按键值排序之后 依次为2 3 4 1(即从小到大排序为第二个数,第三个数。。。),所以,第二个数是最小的,即f[2]=1,f[3]=2,f[4]=3,f[1]=4,也就是把键值变为了1~n,相对大小还是不变的,即4 1 2 3。比如要求原来四个数的逆序数总和,现在就是求4 1 2 3的逆序数总和,大大节省了空间压力(树状数组的长度是数据范围)#include&l 阅读全文
posted @ 2011-08-29 10:56 Because Of You 阅读(1082) 评论(0) 推荐(0)
摘要:View Code 1 #include<stdio.h> 2 #include<string.h> 3 #define MAX 32200 4 int c[MAX],level[MAX]; 5 int n; 6 int get_val() 7 { 8 int ret(0); 9 char c; 10 while((c=getchar())==''||c=='\n'||c=='\r'); 11 ret=c-'0'; 12 while((c=getchar())!=''&&c! 阅读全文
posted @ 2011-08-28 19:01 Because Of You 阅读(306) 评论(1) 推荐(0)
摘要:Matrix Chain MultiplicationTime Limit:1000MS Memory Limit:32768KTotal Submit:36 Accepted:26DescriptionMatrix multiplication problem is a typical example of dynamical programming.Suppose you have to evaluate an expression like A*B*C*D*E where A,B,C,D and E are matrices. Since matrix multiplication is 阅读全文
posted @ 2011-08-28 13:05 Because Of You 阅读(383) 评论(0) 推荐(0)
摘要:霍夫曼树的具体证明在离散数学书上有,我总结大意如下:我们平常查询单词的时候,总会有一些词查询的频率高,一些词查询的频率低,如果建立一棵树来查询,应该使那些经常查询的码(信息经过无损压缩后)的深度尽量小,这样,既省时间,又省空间。同样的前缀码会有不同的树权,树权最小的树就称为最优树,所以,对于英文字母的最佳编码问题就是求最优树 的问题。霍夫曼树每次贪心取最小的两片叶子,让他们成为兄弟,并成一棵树,权值相加并成新的一个节点,最后所有的节点合成一棵树,即为最优树。以一道题目为例:EntropyTime Limit:1000MS Memory Limit:65536KTotal Submit:23 A 阅读全文
posted @ 2011-08-25 17:58 Because Of You 阅读(2344) 评论(0) 推荐(0)
摘要:今天做了经典的食物链,在总结网上其它做法后,小结如下:题意:一共就三种动物,如果A吃B,B吃C==》C吃A; A吃B,A吃C==》B、C为同类A被B吃,A被C吃==》B、C为同类用并查集来做:两种动物之间的关系通过于根节点的相对关系得出,所以关键是路径压缩与合并两个集合时的动物与根节点相对关系的变化,其实也可认为是一个问题,因为路径压缩中的变化其实是合并集合产生的子问题。用delta【i】来表示i和i的父节点的关系,rank[i]=0/1/2分别表示 i 与父亲是同类、被父亲吃、吃父亲。先讲合并操作:设tx为x的父亲,ty是y的父亲,所以delta[x]表示x和tx的关系,delta[y]表示 阅读全文
posted @ 2011-08-24 14:31 Because Of You 阅读(1547) 评论(2) 推荐(1)