摘要:队友给的思路,感觉思路很好啊==对图进行dfs扫描,假设u->v,遇到已经扫过的点v,计算当前点u和v的lca,lca和u以及v之间形成了一个环(计算奇偶)这样只能计算有没有简单的奇偶环,比如两个简单的奇环在一起就成了偶环(无论两个奇环共享几条边)所以在dfs中扫完子树之后,看有没有找到过两个奇环,...
阅读全文
摘要:很显然的lca树上倍增问题1.两个点是相同点ans=n2.两个点深度相同ans=n-size 包含x子树-size 包含y子树3.两个点深度不同:则ans=深的那个向上走step/2步的size-向上走step/2-1的size然后用倍增写啦==额我的solve函数好丑 1 #include 2 #...
阅读全文
摘要:首先如果是两个点那应该从中间切成两半,再判断所属所以必然需要使用树上倍增==继而如果是三个点,则需要仔细分情况讨论==参考别人的分类讨论写的,感觉那个type判断在哪条链很巧妙啊~ 1 #pragma comment(linker,"/STACK:16777216") 2 #include 3...
阅读全文
摘要:首先:可以利用加一个虚拟节点连向所有点,边权即为点权,求一遍最小生成树然后在这棵树上预处理一个倍增,在向上倍增的过程中开一个maxdis[x][j]记录从x开始向上2^j步最大线段这样就可以实现log的查询了== 1 #include 2 #include 3 #include 4 usin...
阅读全文
摘要:这是基于二分搜索的,这个感觉更好写,利用任何整数可以由多个2^x次方数相加得到来进行向上路径倍增。代码和思路一样,相比较RMQ更为简单== 1 #pragma comment(linker,"/STACK:16777216") 2 #include 3 #include 4 #include 5 u...
阅读全文
摘要:杭电这题在线rmq用C++交会RE,G++才能过,但是手动开个栈C++就能AC了。。在线RMQ用的一种倍增思想,还是很常见的,必然要熟练运用数组具体功能代码里面都有:dis[N] 距离根节点距离id[N] 节点映射到dfs时间序上doit[X] 时间点对应的原节点depth[X] 该时间点深度RMQ...
阅读全文
摘要:1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 struct dian{ 7 int v,id; 8 }; 9 int now;10 vectormp[100005];11 int vis[10000...
阅读全文