随笔分类 - 

摘要:《树链剖分及其应用》一文讲得非常清楚,我一早上就把他学会了并且A了这题的入门题。spojQTREE题目:给出一棵树,有两种操作:1.修改一条边的边权。2.询问节点a到b的最大边权。直接粘代码。更成熟的代码可以看下一篇BZOJ 1036: [ZJOI2008]树的统计Count#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;typedef unsig 阅读全文
posted @ 2013-08-24 12:26 yejinru 阅读(394) 评论(0) 推荐(0) 编辑
摘要:/*哈弗曼编码,比如权值为 a:1 b:1 c:2 d:3 e:5 f:6 的树 1.开始时由最小的两个数 a:1 b:1组成一棵树 2.接着由新的最小的两个数 2 c:2 d:3 e:5 f:6 中的 2 c:2组成新的树 3.接着由最小的两个数 4 d:3 组成新的树 4.接着由最小的两个数 e:5 f:6 组成一棵树 5.接着由最小的两个数 7 11 组成一棵树(最终形成) 6.算最小的编码总长:= 18 + 7 + 11 + 4 + 2 = 42 2 4 7 11 18 / \ / \ / \ / \ / \ a b2 c 4 de f 7 11 / \ / \/ \ /... 阅读全文
posted @ 2012-03-21 19:04 yejinru 阅读(173) 评论(0) 推荐(1) 编辑
摘要:编辑器加载中.../*题目: 问能否组成一棵树分析: 注意到该树为有向树,入度不能大于一,同时所有节点都应该能指向根, 可以用并查集查找是否有共同的根,有的话就不是树了,注意此时应该 要判断是否有两个入度,就不能用压缩路径的并查集,并且只能把出度 的点付给入度的点的并查集数组(不知道我自己理解是否有错。。。), 最后要判断是不是森林,可以用第一个点来检验与后面所有的节点是否 有交集,只要有一个没有的话,就是森林而不是树 (空树也是树。。。) 从poj中的discuss中找到 1: 0 0 空树是一棵树 2: 1 1 0 0 不是树 不能自己指向自己 3: 1 2 1 2 0 0 不是树.... 阅读全文
posted @ 2012-03-20 21:15 yejinru 阅读(169) 评论(0) 推荐(0) 编辑
摘要:编辑器加载中...题目: 给出一些树名,问每一棵树的所占的比例分析: 就是给树按字典序排序,并输出他们所占的比例,由于本题涉及的树名比较多,可以采用 二分搜索树来做,然后按照中序遍历即可#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define X 50int cnt;struct node //树的结构体{ int id; //储存个数的 char name[X]; //储存名字 node *rchild; //右子树 node *lchild; //左 阅读全文
posted @ 2012-03-01 12:31 yejinru 阅读(173) 评论(0) 推荐(0) 编辑
摘要:题目:判断有没有两个电话号码能构成前缀关系分析:动态构树果然是Time limitted,只能是用静态构树或者直接安字典序排完序后比较相邻两个是否能构成前缀关系。。。下面简单说说动态构树吧(应该是对的。。)下面这个程序因为判了time limitted,应该是对的。。。#include <iostream>#include <cstdio>using namespace std;struct trie{ //定义字典树bool end;bool id;trie *p[10];//一共十位数字trie(){end = false;//判断此处到根处有没有单词,有返回tru 阅读全文
posted @ 2012-02-29 22:15 yejinru 阅读(234) 评论(0) 推荐(1) 编辑
摘要:题目:给出英文和密码文的互译,现在给出密码文求给出英文解析分析:还是可以用字典树来构造的(当然还可以用快排+二分法,哈希函数做),先给出trie树的构造吧#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define X 12#define MAXN 100005char ch[2*X],s1[MAXN][X],s2[X];int cnt;struct trie //定义字典树的结构体{bool haveend;//记录是否有单词在这结束的int id; // 阅读全文
posted @ 2012-02-29 22:14 yejinru 阅读(282) 评论(0) 推荐(0) 编辑
摘要:题目:问你最短能构成前缀的且不包括已有的单词(当没有时为自己)的单词分析:用trie树做,动态构树,然后从根节点开始往下找,当找到之前是已经有单词或者该处的单词已经走过该节点,继续往下,直到这两个条件不成立为止#include <iostream>#include <cstring>#include <cstdio>using namespace std;struct trie{ //trie树bool haveword;//标记是否已有树int num; //表示到目前为止单词走过该节点的单词数trie *p[26];trie(){haveword = f 阅读全文
posted @ 2012-02-29 22:13 yejinru 阅读(144) 评论(0) 推荐(0) 编辑
摘要:/*原来动态构树是这么费时间的。。。20000个单词最长为20个的题,跑到了1688MS,题目:题目大概是说找出相同的字符串并且统计个数。分析:因为昨天刚学完trie树,现在练了几道,有点感觉了,其实本题应该是可以用快排直接安字典序进行排序,然后按前后关系来进行判断有多少个的,下面继续讲讲trie树动态构树法吧:看程序解析*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define X 20005int d[X],cnt,print[X];structt 阅读全文
posted @ 2012-02-29 22:13 yejinru 阅读(204) 评论(0) 推荐(0) 编辑