https://blog.csdn.net/hpu2022/article/details/81910490 https://blog.csdn.net/qq_39670434/article/details/78425125 https://www.cnblogs.com/gj-Acit/p/3236843.html https://blog.csdn.net/iamzky/article/details/18923587 void dfs(int u) { in[u] = ans; ; i…
首先安利自己倍增求LCA的博客,前置(算不上)知识在此. LCA有3种求法:倍增求lca(上面qwq),树链剖分求lca(什么时候会了树链剖分再说.),还有,标题. 是的你也来和我一起学习这个了qwq. 开始吧. 众所周知,每当你dfs时,你都能产生一棵dfs树,可以根据你的dfs序来构建. such as(丑陋的画风): 一个dfs的顺序. 以这个为例: 那么我们写出他的遍历顺序: 假如我们要求3,8(wtf?)的LCA, 那么我们首先写出他的bfs序: 123432565217871. 然后…
题意:给定一棵树,树上每个节点有对应的字符,多次询问在\(u\)子树的深度为\(d\)的所有节点上的字符任意组合能否凑成一个回文串 把dfs序存储在一个二维线性表中,一个维度记录字符另一个维度记录深度 因为dfs序是单调递增的,所以每个二维表的值也是单调递增的 那么只需用两次二分把合法的儿子搞出来就行 感觉是个比较奇怪的姿势,总之学习了 //时间空间都这么暴力真的大丈夫? #include<bits/stdc++.h> #define rep(i,j,k) for(register int i…
#include <iostream> #include <vector> using namespace std; int n; const int MaxN = 1e5; long long w[MaxN + 1]; long long ans; vector<int> g[MaxN + 1]; void dfs(int root, int fa) {     for (int i = 0; i < g[root].size(); ++i) {        …
https://www.lydsy.com/JudgeOnline/problem.php?id=2434 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: ·输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后). ·按一下印有'B'的按键,打字机凹槽中最后一个字母会消失. ·按一下印有'P'的按键,打字机会在纸上打印出凹槽中现有的所有字母并换行,但凹槽中的字母不会消失. 例如,阿狸输入aPaPBbP,纸上被…
DFS序就是将树的节点按照先根的顺序遍历得到的节点顺序 性质:一个子树全在一个连续的区间内,可以与线段树和树状数组搭配使用 很好写,只需在dfs中加几行代码即可. 代码: void dfs(ll u,ll fat) { st[u]=++tim;//st记录出现位置,tim记录当前的时间戳 dfn[tim]=u;//dfn记录dfs序 for(rll i=h[u];i;i=e[i].nxt)//遍历 { ll v=e[i].v; if(v!=fat) { dfs(v,u);//搜索 } } en[…
http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================================8-20=============================== 这题我真的逗了,调了一下午,疯狂造数据,始终找不到错. 后来发现自己sb了,更新那里没有打id,直接套上u了.我.... 调了一下午啊!一下午的时光啊!本来说好中午A掉去学习第二种做法,噗 好吧,…
题目链接 首先不需要存储每个字符串,可以将所有输入的字符依次存进Trie树,对于每个'P',记录该串结束的位置在哪,以及当前节点对应的是第几个串(当前串即根节点到当前节点):对于'B',只需向上跳一个节点. 然后构建Trie图.fail[]有一个重要意义是: 若fail[y]=x,那么y节点表示的串一定包含x节点表示的串. 于是暴力就可以自底向上查询y串中每个节点的fail[]是否直接或间接指向x 注意到每个节点的fail[]是仅指向一个节点的,于是可以反向建图fail[x]->x,这样就形成了…
update-2018.07.23: 原文问题五思路描述有误,已更正. 参考自:<数据结构漫谈>-许昊然 dfs序是树在dfs先序遍历时的序列,将树形结构转化成序列问题处理. dfs有一个很好的性质:一棵子树所在的位置处于一个连续区间中. ps:deep[x]为x的深度,l[x]为dfs序中x的位置,r[x]为dfs序中x子树的结束位置 1.点修改,子树和查询 在dfs序中,子树处于一个连续区间中.所以这题可以转化为:点修改,区间查询.用树状数组或线段树即可. 2.树链修改,单点查询 将一条树…
作者:weeping 出处:www.cnblogs.com/weeping/ 原文链接 https://www.cnblogs.com/weeping/p/6847112.html 参考自:<数据结构漫谈>-许昊然 dfs序是树在dfs先序遍历时的序列,将树形结构转化成序列问题处理. dfs有一个很好的性质:一棵子树所在的位置处于一个连续区间中. ps:deep[x]为x的深度,l[x]为dfs序中x的位置,r[x]为dfs序中x子树的结束位置 1.点修改,子树和查询 在dfs序中,子树处于一…