LCA&&并查集
hexianhao
这个作者很懒,什么都没留下…
展开
-
poj 1703(种类并查集)
题目大意:在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙 输入D x y代表x于y不在一个团伙里 输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙里 解题思路:这道题是一道很经典的种类并查集,除了有father[i]表示父亲节点外,还有rank[i]表示节点i与其父亲节点之间的关系,0表示是同类,1表示不同类。在路径压缩的时候要注意更新原创 2016-03-31 16:27:12 · 349 阅读 · 0 评论 -
hdu 1558(线段相交+并查集)
题意:给你一些操作,P后边输入四个值,分别代表一条线段的起点、终点坐标,当输入Q时,后边输入一个整形值K,输出第k条线段所在的集合中包含的线段的个数。 解题思路:线段相交+并查集,sum[i]表示i所在的线段集合中,i为根节点的线段总数。在合并时可以更新。 #include #include using namespace std; struct point原创 2016-05-11 15:42:54 · 334 阅读 · 0 评论 -
hdu 1856(并查集)
More is better Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others) Problem Description Mr Wang wants some boys to help him with a project. Because the projec原创 2016-05-12 11:22:03 · 239 阅读 · 0 评论 -
hdu 1198(并查集判断连通性)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectan原创 2016-05-13 11:17:30 · 415 阅读 · 0 评论 -
hdu 4496(并查集的边删除)
D-City Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Problem Description Luxer is a really bad guy. He destroys everything he met. One day Luxer w原创 2016-05-13 14:45:55 · 923 阅读 · 0 评论 -
poj 2985(并查集+线段树求K大数)
解题思路:这道题并查集很容易,合并时找到父节点就直接加上去就ok了。关键是如何求K大数,我一直在想用线段树怎么写,一开始想如果直接记录数的大小那肯定是没戏了,借鉴了一下别人的思路:区间[a,b]记录的是所有的数里面,等于a,a+1,a+2,......,b-1,b的个数。看到这里就应该明白了,这里线段树的用法是把它看做是一个1-n的数轴。到时候要修改某一个数,就直接在数轴上修改它。至于记录[a,b原创 2016-03-28 20:40:09 · 456 阅读 · 0 评论 -
hdu 5266(线段树+LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置与dfs序较大的那个位置的LCA。因此只要通过st表处理L~R最大dfs序与最小dfs序的编号即可。 这里用线段树维护dfs序的最大和最小值。 #pragma comment(linke原创 2016-07-14 09:45:58 · 290 阅读 · 0 评论 -
hdu 5157(manacher+前缀和+树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5157 解题思路: 我们可以先用mancher算法对字符串进行处理,把以每个点为中心的回文串半径求出来,然后进行处理。 加入对以p为中心的点,从p-r[i]+1~p都是回文串的开头,那么对于每个回文串(开头是j)只要记录结尾从1~j-1的回文串个数,我们可以用dp记录以每个点为结尾的回文串个数,s原创 2016-07-04 19:26:14 · 455 阅读 · 0 评论 -
hdu 4907(并查集)
Task schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务。 有m个询问,每个询问有一个数字q,表原创 2016-06-19 10:54:28 · 291 阅读 · 0 评论 -
hdu 2473(并查集+删除操作)
解题思路:这道题有并查集的删除操作,如果直接对这一棵树进行删除节点操作肯定是很困难的。所以可以建立虚拟节点,只要有一个节点要被删除,就直接把它投影到虚拟节点上,即用这个虚拟节点来代替我们要删除的节点。这样我们就不需要用对已有的树形结构进行改动了。 这个想法我在Dragon Balls那道题想到了,只是当时那道题这种方法解不了,没想到这道题也用到了这样的思想。 参考博客:http://b原创 2016-03-28 16:45:53 · 439 阅读 · 0 评论 -
hdu 3038(种类并查集)
题目大意:有n次询问,给出a到b区间的总和,问这n次给出的总和中有几次是和前面已近给出的是矛盾的 解题思路:这道题第一次接触很难往并查集方向去思考。这里使用的并查集很灵活,不仅仅要记录其父亲节点,同时还要记录该节点到父亲节点的总和。在更新时,[l,r]要变成[l-1,r],比如有区间[1,2],[3,4],在更新[3,4]时可以合并成一个完整区间[1,4],并且在计算[l,r]区间的总和原创 2016-03-28 15:34:59 · 313 阅读 · 0 评论 -
hdu 4547(LCA+Tarjan)
解题思路:很明显的LCA问题,用Tarjan离线算法即可。这里输入的可能是字符串,所以直接用map保存。此外,根据题意,这里需要稍稍有点变化,因为cd:a\b\c...这里是一步即可完成,所以在查询a和b时,还要判断与公共祖先的关系。还要注意,这道题没有告诉根节点,所以可以根据入度为0来判断根节点。 #include #include #include #include原创 2016-04-01 20:33:49 · 302 阅读 · 0 评论 -
hdu 5274(树链剖分)
解题思路:这道题据说是树链剖分,所以也学习了一下。 http://blog.sina.com.cn/s/blog_7a1746820100wp67.html 不同的是这里是点权值,我按照相似的处理方式,不知道为什么WA了。。。调了好久。。 #include #include #include using namespace std; const int maxn = 10000原创 2016-04-03 21:11:13 · 392 阅读 · 0 评论 -
hdu 3966( 树链剖分+点权更新)
题意:给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有点权值减去K Q C:查询节点编号为C的权值 解题思路:这道题是明显的树链剖分问题,只是这里是点权更新,注意与边权更新的不同,剩下的基本是模板了。 #include #include原创 2016-04-04 17:49:55 · 259 阅读 · 0 评论 -
hdu 3078(LCA+排序)
题意:一棵无根树,输入点数和操作数,下面一行n个值代表每个点的权。下面n-1行是树边 操作分为 0 x w ,表示把点x的权改为w k a b , 求出,从a到b的路径中,第k大的点权 解题思路:这道题没什么特别难的地方,只需要找到两点的LCA,然后回溯上去把路径上所有的点都拿出来排序即可。在回溯的过程中,需要有一个记录该节点父亲节点的fa[]数组,在dfs遍历原创 2016-04-06 09:10:42 · 355 阅读 · 0 评论 -
hdu 2586(LCA + 节点间距离)
题意:给一棵树,询问u和v之间的边权和。 解题思路:找到u和v的最近公共祖先,它们之间的距离为dis[u]+dis[v]-2*dis[lca(u,v)] #include #include #include #include using namespace std; const int maxn = 40005; struct Edge { int k,next,cost;原创 2016-03-25 16:24:51 · 262 阅读 · 0 评论 -
hdu 2874(LCA + 节点间距离)
解题思路:Tarjan离线处理 一篇介绍LCA的很好的博客:http://www.cppblog.com/menjitianya/archive/2015/12/10/212447.html #include #include #include using namespace std; const int maxn = 10005; struct Edge { int k,原创 2016-03-25 17:26:37 · 295 阅读 · 0 评论 -
hdu 3172(并查集+hash)
解题思路:典型的并查集,只是每个人的名字要转换成数字,可以用map,也可以用字典树,我最开始用的字典树结果爆内存了。。 爆内存: #include #include #include using namespace std; const int maxn = 200000; int n,fa[maxn],trie[maxn][52],cnt,id[2000000],num; int原创 2016-03-25 20:45:35 · 233 阅读 · 0 评论 -
hdu 3635(并查集+路径压缩变形)
解题思路:这道题想了我好久,因为我把城市的编号一起考虑进去了,结果想了好久都没A,最后看了别人的题解居然都没有考虑到城市的编号,不考虑城市编号的问题的话就是一个很水的并查集了。 #include #include #include using namespace std; const int MAXN=10000+10; int parent[MAXN]; int _count[MAX原创 2016-03-27 20:45:46 · 308 阅读 · 0 评论 -
hdu 5606(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5606 解题思路: 这题实际上是要找一些连通的节点,使得边上的权值都为0。 很明显,首先把权值为0的边都拿出来,然后利用并查集找到该点所在的连通块,并记录每个连通块的个数。 #include #include #include #include using namespace std; con原创 2016-07-31 17:56:32 · 250 阅读 · 0 评论