数据结构-树
文章平均质量分 80
KIJamesQi
这个作者很懒,什么都没留下…
展开
-
uva122(二叉树建立,中序遍历)
思路:建立二叉树,BFS。/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :*****************************************/// #pragma comment(linker, "/STACK:1原创 2015-10-19 17:26:28 · 523 阅读 · 0 评论 -
uva11992 Fast Matrix Operations
思路:看似一个二维矩阵值的更新,其实就是换成多条线段更新,线段树。总共有3种操作:1. 1 x1 y1 x2 y3 val(在满足(x,y)的点上+val)2. 2 x1 y1 x2 y2 val(把满足条件的点清空为val)3. 3 x1 y1 x2 y3 查询区间值 sum min max。因为有延迟标记,所以每次要down和up下,二维在down的时候还要先考虑区间是否被原创 2015-11-04 17:10:15 · 420 阅读 · 0 评论 -
lightoj1219Mafia
对于某个节点u, 如果整个子树里的人数超过了节点数, 那么显然就要把多余的人移动到点u的父亲处, 而如果人不足, 就需要从u的父亲处拿人过来, 至于u父亲出人够不够, 那么就需要考虑以u的父亲为根的子树了, 所以可以考虑dfs递归处理问题, 对于所有节点, 如果节点上人太多, 多余的人必然要到他父亲那边, 如果没人,必要要从父亲处要人, 所以在每次处理完一颗子树时,根据子树的根的情况, 来修改子树原创 2015-11-25 23:06:15 · 333 阅读 · 0 评论 -
poj2418(Hardwood Species)
思路:建立Tire树,dfs一遍,再del下。// #pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #include #include #include #inclu原创 2015-11-02 22:41:37 · 385 阅读 · 0 评论 -
uva12299(RMQ with Shifts)
思路:这题一眼就是线段树单点更新,,,训练开着题的时候就是傻逼了,,,一看数据很大,时间很小,TLE定了,,,3个小时后再来看,发现别人过的时间都只有300-ms,,,然后再读题的时候就看见了 // #pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #i原创 2015-11-02 22:36:04 · 385 阅读 · 0 评论 -
uva1462(Fuzzy Google Suggest)
思路:建立字典树,然后dfs序列。这题的主要难度在于怎么dfs计数的问题,字典树就是次要的难度。如何表示是不变,增加,删除这三种状态?我们可以用一个指示性的指针来指向序列,用x来表示目前还可以增加删除的次数和。然后对于通过某种不变删除增加的组合形式最后到达的末节点表示为2,中间经过的节点表示为1。最后要注意的就是对于当前字符串搜索完之后要把vis数组清空。// #pragma comm原创 2015-10-30 01:19:13 · 380 阅读 · 0 评论 -
hdu2222(Keywords Search)
思路:题目中有若干个模式川和一个主串,问在主串中出现了几种模式串。显然就是模式串构成AC_Tree(),然后再去匹配主串。因为new 了空间的,所以最后要delete释放。// #pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #原创 2015-10-28 14:20:43 · 408 阅读 · 0 评论 -
poj3177 Redundant Paths
思路:给出一张无向连通图,问至少需要添加几天边可以使得图中任何两个点有至少两天不同路径(边不重合),等价于至少添加几条边可以使得图为双连通分量-边连通。显然已经处于某连通分量中的点之间必然存在两条不同路径,所以可以等效的把这个连通分量看成一个点来对待,这样就是缩点了,然后得到一棵树,此时推一下就知道还需要的边数=(叶子节点数 + 1)/ 2。// #pragma comment(linke原创 2015-11-13 10:05:42 · 264 阅读 · 0 评论 -
uva11235 Frequent values
思路:这个是RMQ变形,因为这个是一个non-decreasing order序列,所以同一个数是连续的,那么我们可以先处理下每个连续的数的左右边界,也就是l[i],r[i]的值,num[i]表示当前位置的数所属段的标号。对每种数进行编号,也就是每个段。建立Segment-Tree,再就是询问的时候,因为给的是原坐标,所以要转换成所属的段标号,如果是同一个段,那么直接坐标相减+1,否则就进行RMQ原创 2015-11-06 16:52:01 · 524 阅读 · 0 评论 -
poj2418
思路:建立字典树,dfs查找,然后输出频率。// #pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #include #include #include #includ原创 2015-11-04 22:08:22 · 397 阅读 · 0 评论 -
fzu2038 Another Postman Problem
思路:状态应该被狗日了,,,sum没有请0等错误然后wa了9发因为这个是树,而且没有森林,所以呢,只需要求出每条边两端的点数,然后经过这条边的次数就等于两边点数的乘积,此时因为是有方向的左到右,右到左,所以要double下。还有就是福大是win环境,要用I64d输出LL。// #pragma comment(linker, "/STACK:1024000000,1024000000")原创 2015-10-20 17:03:01 · 313 阅读 · 0 评论 -
uva536(先序 + 中序输出后序)
点击题目链接/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :*****************************************/// #pragma comment(linker, "/STACK:10240000原创 2015-10-03 11:59:53 · 474 阅读 · 0 评论 -
uva297(四叉树建立)
思路:根据题意,每个字母都是代表一个正方形的方块,那么我们要表示这个正方形就只需要左上角的坐标和宽度,字母'P'表示这个方块里面有黑块,但是不是全部都是,所有要针对这个方块继续递归建树,‘f’表示这个方块全是黑色的,那么就可以开始统计数目了。‘e’就直接忽略丢就好了。点击题目链接/*****************************************Author原创 2015-10-03 13:57:50 · 553 阅读 · 0 评论 -
uva548
思路:题目的意思是找一条从根节点到叶子节点的路径,从所有路径中找一条路径节点和最小的路径,并输出该路径的最后一个节点的值;模拟二叉树还原,记录前面的值,到达叶子节点的时候比较下就好了。点击题目链接/*****************************************Author :Crazy_AC(JamesQi)Time :2015Fi原创 2015-10-03 12:32:25 · 629 阅读 · 0 评论 -
uva1292(基础树形dp)
思路:题目的意思是,游一棵树或者是森林,然后要在某些节点上放置一个警察来防卫,然后每个警察呢只能防卫到自己所在节点和相邻的节点,求所有节点都在直接或间接被防卫的时候需要的最少警察数目。意思显然,然后就是dp了;对于当前节点的决策是选与不选,dp[i][j],表示第i个节点的是否直接放置警察;初始化是dp[i][1]=1;dp[u][1] += min(dp[v][1],dp[v][0]原创 2015-10-20 00:22:10 · 454 阅读 · 0 评论 -
uva10410(树还原BFS)
思路:根据一棵树的先序和中序还原整棵树,记录每个节点的儿子节点,然后打印出来。此类题目是比较典型的树还原的考点。不同与二叉树的是,这个可能是多叉树,不能像二叉树那样简单的进行儿子节点的判断。// #pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #i原创 2015-10-20 00:18:08 · 643 阅读 · 0 评论 -
uva699(根据先序还原树)
思路:建立一个数组,从中间位置开始建树做记录,往左子树走就左加,往右子树走就右加;点击题目链接/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :*****************************************原创 2015-10-03 12:51:38 · 472 阅读 · 0 评论 -
uva1220(基础树形dp)
思路:这题很容易想到状态,就是当前节点u选与不选,其某子节点v。那么dp[i][j]其中i为节点编号,j表示为选(1)与不选(0)。显然:选u,dp[u][1] += dp[v][0],再就是唯一性的判定。不选u,dp[u][0] += max(dp[v][1],dp[v][0]),再就是唯一性的判定。走到叶子节点时,dp[v][0] = 0,dp[v][1] = 1,/***原创 2015-10-19 17:39:02 · 516 阅读 · 0 评论 -
hdu4607Park Visit(求树的直径)
给定的树中,任选一个点开始走,访问k个点,求最小路径长度。思路:现求出树的直径r,如果k不然的话,就要走直径上链接的分支了,出了直径上的点还需要走k-r个点,此时的额外路径就是(k - r)*2。/*****************************************Author :Crazy_AC(JamesQi)Time :2016File原创 2016-03-24 17:22:20 · 362 阅读 · 0 评论