![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 66
logic_nut
这个作者很懒,什么都没留下…
展开
-
pku 1611 The Suspect(最简单的并查集)
通过这个题目,学习了下并查集的使用,详细的介绍在《算法导论》上。并查集有三个基本操作,makeset(建立一个集合),find(找到某个元素所在集合的代表元素),union(合并两个集合)。根据启发式策略的不同,在实现上略有差异。 #include using namespace std;struct Node{ int parent; //指向父节点 i原创 2009-07-19 13:15:00 · 669 阅读 · 0 评论 -
pku 2513 Colored Sticks(Trie树,并查集,欧拉通路)
trie树,用来形成char[]与int之间的对应。(hash也不错)颜色是节点,stick是边。possible的充要条件是图中存在欧拉通路。存在欧拉通路的充要条件是:1 图是连通的(并查集判断)。2 图中节点的度,全部为偶数或者2个节点的度为奇数。#include using namespace std;#define NODE_MAX 1000005#defi原创 2009-08-09 13:23:00 · 841 阅读 · 1 评论 -
并查集及其应用
转自 http://hi.baidu.com/fandywang_jlu/blog/item/b49e40893ddbb0b00f244485.html 并查集的学习告一段落,整理总结一下与大家共勉~ 并查集:(union-find sets)是一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分转载 2009-08-16 15:20:00 · 649 阅读 · 0 评论 -
pku 2528 Mayor's posters(线段树)
很典型的线段树,区域比较大需要加离散化。之前做pku3277,离散化后没有排除重合的点也过了。今天照着上次那样写过不了,想了几种情况后发现之前的做法是错误的,对于这种统计区域内颜色的问题离散化后必须排除重合点。上次可以过是因为那是求的面积才没有影响。看到discuss里有人说 离散化+倒着贴,想想的确不失为一个好办法。#include #include using namespac原创 2009-08-29 16:59:00 · 807 阅读 · 0 评论 -
pku 2828 Buy Tickets(线段树)
倒着往队列里面插,每插入一个位置,就说明这个位置已经有人占了,删除这个位置。比如说数据 pos value,那么就寻找队列中除去已经有人占据的位置后的第pos+1个位置。 我的代码是用标准规格的线段树写的,节点有left,right,cnt(记录该区段内被占据的位置的数量)域。看到有些别人的代码,直接只用节点记录该区段内剩余有效位置数量,把insert和search操作结合,是个很原创 2009-08-30 10:28:00 · 1804 阅读 · 1 评论 -
pku 2352 Stars(线段树)
输入居然都帮忙排好序了,把最关键的一步给做了。线段树,这里我没给节点left,right域,而是在函数递归的时候直接传过去。#include using namespace std;const int maxn=32005;int tree[maxn*8],ans[15000];int Search(int i,int x,int left=0,int right=maxn原创 2009-08-30 12:12:00 · 684 阅读 · 0 评论 -
pku 1703 Find them, Catch them(并查集)
给节点增加一个域,纪录与父节点的关系,是相同还是不同。#include using namespace std;const int maxn=100005;struct Node{ int parent; bool same;}person[maxn];int Find(int x,bool& same){ same=true; while(pers原创 2009-08-31 08:30:00 · 522 阅读 · 0 评论 -
pku 3321 Apple Tree(时间戳,树状数组)
题目:给定一棵树(题目中默认节点1为根),树的节点上可能有苹果,也可能没有。需要查询某个节点及其子节点上的苹果数量之和,并且支持节点上长苹果或苹果被摘。分析:需要统计范围和,树状数组是个不错的选择。可是根据当前节点的编号,是没办法使用树状数组的。对于节点i,我们必须让节点i的所有子节点的编号和i连续。对此我们需要做一些预处理。建好树,用DFS对树进行后序遍历,根据访问时间给节点重编原创 2009-09-22 11:20:00 · 1145 阅读 · 0 评论 -
pku 1195 Mobile phones(二维树状数组)
极其标准的二维树状数组#include using namespace std;const int maxn=1050;int tree[maxn][maxn];int n;inline int lowbit(int x){ return x&(x^(x-1));}void insert(int x,int y,int t){ while(x<=n)原创 2009-09-22 12:15:00 · 496 阅读 · 0 评论 -
常见的hash函数
转自http://hi.baidu.com/aconly/blog/item/5c82eb76f70f601cb051b952.html 字符串的 hash (有许多现成函数,选择合适的就行) poj 2503 int ELFhash(char *key) { unsigned long h=0; while(*key)转载 2009-08-08 18:23:00 · 945 阅读 · 0 评论 -
pku 1971 Parallelogram Counting(hash)
判断有多少个平行四边形。首先想到的肯定是斜率,但因为是斜率可能出现小数,不好判断,放弃。然后我们可以发现平行四边形有个重要的性质,对角线互相平分,这样我们可以通过判断点对的中点是否重合来确定是否能构成平行四边形。 这是我第一次用真正意义上用hash,5000MS的限制我用了4700MS。#include using namespace std;#define maxLen原创 2009-07-26 21:52:00 · 816 阅读 · 0 评论 -
pku 3277 City Horizon(离散化+线段树)
因为坐标范围太大,所以将输入的坐标离散化,排序后用下标来代替,线段树插入操作的时候用binary_search来查找坐标对应的下标。因为height大的影子总是会覆盖height小的影子,所以将输入按height排序后再插入线段树,会省掉很多麻烦。 #include #include using namespace std;#define MaxBuilding 4000原创 2009-07-25 14:38:00 · 1002 阅读 · 0 评论 -
pku 1861 Network(并查集实现Kruskal)
Kruskal算法。先按length用qsort排序,再利用并查集来做。我一开始给并查集操作加上了路径压缩,但后来我把那段代码去掉后再提交,运行时间却基本没变化。 #include using namespace std;struct node{ int length; short first; short second;};short paren原创 2009-07-20 10:42:00 · 751 阅读 · 2 评论 -
pku 1182 食物链(并查集扩展)
有 A,B,C 三种物种 , 但因为给定的 N 个动物之间的关系是相对的,我们没办法只用三个集来表示 N 个动物所属的物种。网上都说这题是用并查集做的,其实这题并没有集合的概念,大部分人只是借鉴了并查集的数据结构及操作。 我的思路是这样的,用树来存储各动物间的相互关系。结点有两个域, parent 和 flag ( parent 的作用大家都知道,这里 flag 用来表示子节点和父节点的原创 2009-07-19 21:20:00 · 1185 阅读 · 0 评论 -
pku 1456 Supermarket(并查集扩展)
贪心算法,每次先选当前价值(price)最大的product[i],如果product[i].deadline之前有哪天还没被占用,则ans+= product[i]. price,并把product[i]占用的那一天标记。实现:读入数据,按照product.price排序,从price大的一端开始遍历product。现在核心的问题是:如何快速确定product[i].deadline前原创 2009-07-21 11:49:00 · 658 阅读 · 0 评论 -
pku 1988 Cube Stacking(并查集扩展)
这道题自己想了很久,一直不敢下手。 用并查集来做,题目中的每个stack 对应一个集合。 parent[] ,根节点存储树的子节点数量sum ,非根结点存储父节点。 up[i] ,存储结点i 到父节点的距离。路径压缩后,父节点即根节点,则输出结果为count[i]=sum-up[i]-1 ; 当把stack A 放到stack B 上面的时候,做集合的Union() 操作,原创 2009-07-21 00:33:00 · 1062 阅读 · 2 评论 -
pku 2777 Count Color(线段树变形)
因为操作次数很多,所以修改操作应该选用O(logN)的方式,线段树成为最佳选择。这题有两个注意的地方,一是因为线段以segment为划分单位,所以右子树的left比左子树的right要大1。二是给线段树结点增加一个color域,当整个线段为纯色时,color=颜色代号,当线段内有多种颜色是,color=-1。这里当父节点涂色时,说明其所有子节点的颜色都需要更新。但因为考虑到效率问题,不可原创 2009-07-26 07:19:00 · 1480 阅读 · 0 评论 -
线段树的实现(模板)
线段树在一类问题中,我们需要经常处理可以映射在一个坐标轴上的一些固定线段,例如说映射在OX轴上的线段。由于线段是可以互相覆盖的,有时需要动态地取线段的并,例如取得并区间的总长度,或者并区间的个数等等。一个线段是对应于一个区间的,因此线段树也可以叫做区间树。线段树的构造思想线段树是一棵二叉树,树中的每一个结点表示了一个区间[a,b]。每一个叶子节点表示了一个单位区间。对于每转载 2009-07-25 14:52:00 · 1735 阅读 · 0 评论 -
pku 1200 Crazy Search(匹配,映射)
#include using namespace std;char str[1000000];int chartoint[125];//存储字符和数字的映射bool exist[16000000];//题目中有 maximum number of substrings formed by the possible set of characters does not exceed原创 2009-07-26 19:44:00 · 651 阅读 · 0 评论 -
pku 2021 Relative Relatives(相对关系的数据结构)
因为涉及到相对关系,我第一个想到的东西是并查集。这道题目我也差不多是用并查集的思想来做的,用数组来记录相互之间的关系,等整个关系网建立好后就来依次计算每个人的年龄。因为一个人只能有一个父亲,所以每个关系中的cname相对于所有人名的集合来讲都是unique的。我选择了每对关系中的cname作为标志,先用它排个序,然后每次用到的时候就用二分查找来寻找它对应的数组下标。这样做速度还挺快原创 2009-07-26 10:08:00 · 1015 阅读 · 0 评论 -
pku 2481 Cows(预处理,树状数组)
给定n个区间(l,r),问每个区间被多少个另外的区间所包含。包含的定义(l1,r1),(l2,r2),如果l1 用节点存储区间,然后给节点排序。l小的区间放在前面,l相同则r大的区间放在前面。为什么这样排序呢?因为对排序之后的节点,节点n只可能被排在它前面的(0--n-1)号节点包含,而不可能被后面的包含。那么(0--n-1)号节点中,又哪些能包含节点n呢?只要ri>=rn即可原创 2009-09-21 18:29:00 · 963 阅读 · 3 评论