BZOJ.2125.最短路(仙人掌 圆方树)】的更多相关文章

题目链接 圆方树.做题思路不写了.. 就是当LCA是方点时跳进那个环可以分类讨论一下用树剖而不必须用倍增: 如果v是u的(唯一的那个)重儿子,那么u的DFS序上+1的点即是要找的:否则v会引出一条新的链. 不用圆方树的做法(代码错了不想改了,但是能A). //3876kb 148ms(Rank6!) #include <cstdio> #include <cctype> #include <algorithm> //#define gc() getchar() #def…
仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图片想看起来舒服一点,也可以把图片变成这样子 (图片来源于网络) 2.DFS树 为啥要写这个?--因为这个看起来也可以解决一些仙人掌的问题. 对于一个仙人掌,我们随便构建出一棵生成树. 然后我们就多了一些边--可以叫返祖边,非树边--你想叫啥就叫啥. 因为每条边只会出现在一个环中, 所以每一条返祖边覆盖了树中…
仙人掌 && 圆方树 && 虚树 总结 Part1 仙人掌 定义 仙人掌是满足以下两个限制的图: 图完全联通. 不存在一条边处在两个环中. 其中第二个限制让仙人掌的题做起来十分舒服. 仙人掌的基环DP 首先勾出一棵有根生成树. 那么树边上正常转移即可. 我们把返祖边形成的环归到环上深度最浅的点上,即环顶. 那么到环顶时,单独跑一遍关于环的\(DP\)即可. 一般写法为: void dfs(RG int u,RG int From) { dfn[u] = low[u] = +…
仙人掌&圆方树 Tags:图论 [x] [luogu4320]道路相遇 https://www.luogu.org/problemnew/show/P4320 [ ] [SDOI2018]战略游戏 https://www.luogu.org/problemnew/show/P4606 [x] [APIO2018]铁人两项 https://www.luogu.org/problemnew/show/P4630 [ ] [SHOI2008]仙人掌图 [ ] [BZOJ4316]小C的独立集 [x]…
题目链接 多次询问求仙人掌上两点间的最短路径. 如果是在树上,那么求LCA就可以了. 先做着,看看能不能把它弄成树. 把仙人掌看作一个图(实际上就是),求一遍根节点到每个点的最短路dis[i]. 对于u,v,若w=LCA(u,v)不在环上(u,v不同在一个环),那么dis(u,v)可以像在树上一样直接求得. 若w=u||w=v,(且w不是环内的一个点),dis(u,v)=dis[u/v]-dis[w]. 如果w在环上,那么设x,y为u,v往上距离最近的环上的离u,v最近的两个点,那么dis(u,…
传送门 人生的第一道仙人掌. 这道题求是仙人掌上的最短路. 先建出圆方树,然后用倍增跑最短路,当lca" role="presentation" style="position: relative;">lcalca是圆点和方点时分类讨论答案即可. 代码如下: #include<bits/stdc++.h> #define N 20005 using namespace std; inline int read(){ int ans=0;…
题目链接 本代码10分(感觉速度还行..). 建圆方树,预处理一些东西.对询问建虚树. 对于虚树上的圆点直接做:对于方点特判,枚举其所有儿子,如果子节点不在该方点代表的环中,跳到那个点并更新其val,加入B数组:对于环中的点直接加入B数组. 然后像BZOJ2125一样更新环上的.懒得写拆环的单调队列了,直接用min(abs,len-abs). UOJ特么的数据有毒啊.调不出来了,AC的代码一个比一个码风奇特,还有的贼长..先不调了. 一上午+半下午了..从注释的代码可以看出调的过程多么鬼畜. /…
题目链接 显然先建圆方树,方点权值为0圆点权值为1,两点间的答案就是路径权值和减去起点终点. 对于询问,显然可以建虚树.但是只需要计算两关键点间路径权值,所以不需要建出虚树.统计DFS序相邻的两关键点间路径权值,最后除以2就好了. 因为这个前缀和统计不到根节点,所以要加上当前虚树的根节点的权值,即(LCA(A1,AK)<=n). 话说这是二轮的题啊?? 为什么我当时不知道圆方树和虚树→_→而且怎么好多人都不知道的样子.. 有些前几了,第一个Rank1..激动 //36624kb 4516ms #…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2125 因为看了TJ又抄了标程,现在感觉还是轻飘飘的……必须再做一遍. 两点间的情况: 1.直到 lca 都没有在一个环上的部分: 2.本来就处在一个环上: 3.本来不在一个环上,快到 lca 的时候开始处在一个环上了. 第一种情况就普通弄就行.处理倍增 lca 数组和根到每个点的最短路dis值. 第二种情况在环上两部分取较短的就行. 第三种情况是前两种的结合.需要找到 p 和 q 刚开始在…
orzYCB 虚树 %自为风月马前卒巨佬% 用于优化一类树形DP问题. 当状态转移只和树中的某些关键点有关的时候,我们把这些点和它们两两之间的LCA弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. 容易证明,如果关键点数量为\(m\),则虚树点数不超过\(2m\). 虚树的构建 dfs原树,对点进行dfn标号,并将关键点按dfn从小到大排序. 搞个栈,栈内的点满足:都在从栈顶的点到原树的根的一条链上. 现在我们准备加入一个点\(x\) 直接加可能破坏一条链的性质,于是把栈顶的元素弹掉直到可以加…