题目概括 题目描述 这个游戏会给出你一棵树,这棵树有\(N\)个节点,根结点是\(R\),系统会选中\(M\)个点\(P_1,P_2...P_M\). 要Imakf回答有多少组点对\((u_i,v_i)\)的最近公共祖先是\(P_i\). Imakf是个小蒟蒻,他就算学了LCA也做不出,于是只好求助您了. Imakf毕竟学过一点OI,所以他允许您把答案模 \((10^9+7)\) 输入输出格式 输入格式 第一行 \(N , R , M\) 此后\(N-1\)行 每行两个数\(a,b\) 表示\(…
专心OI - 找祖先 题目背景 \(Imakf\)是一个小蒟蒻,他最近刚学了\(LCA\),他在手机\(APP\)里看到一个游戏也叫做\(LCA\)就下载了下来. 题目描述 这个游戏会给出你一棵树,这棵树有\(N\)个节点,根结点是\(R\),系统会选中\(M\)个点\(P_1,P_2...P_M\),要\(Imakf\)回答有多少组点对\((u_i,v_i)\)的最近公共祖先是\(P_i\).\(Imakf\)是个小蒟蒻,他就算学了\(LCA\)也做不出,于是只好求助您了. \(Imakf\)…
P5002 专心OI - 找祖先 给定一棵有根树(\(n \leq 10000\)),\(M \leq 50000\) 次询问, 求以 \(x\) 为 \(LCA\) 的点对个数 错误日志: 看下面 Solution 设点 \(u\) 的子树大小为 \(size[u]\) 现询问以 \(u\) 为 \(LCA\) 的点对个数 设 \(u\) 的子节点为 \(v_{1}, v_{2},...,v_{m}\) 我们现在统计点对中一个点在 \(v_{1}\) 内的答案数 一个点在 \(v_{1}\)…
题目描述 这个游戏会给出你一棵树,这棵树有NN个节点,根结点是RR,系统会选中MM个点P_1,P_2...P_MP 1 ​ ,P 2 ​ ...P M ​ ,要Imakf回答有多少组点对(u_i,v_i)(u i ​ ,v i ​ )的最近公共祖先是P_iP i ​ .Imakf是个小蒟蒻,他就算学了LCA也做不出,于是只好求助您了. Imakf毕竟学过一点OI,所以他允许您把答案模 (10^9+7)(10 9 +7) 输入格式 第一行 N , R , MN,R,M 此后N-1N−1行 每行两个…
[传送门] 我们还是先将一下算法的步骤,待会再解释起来方便一点. 算法步骤 首先我们算出每个子树的\(size\). 我们就设当前访问的节点 然后我们就得到了当前这个节点的答案是这个树整个的\(size\)的两倍\(-1\),再加上两两子树的\(size\)的积. 也就是$ans=size[u] \times 2 - 1 +\sum size[i] * size[j] $ 其中\(i\)和\(j\)是u的儿子. 一下就是核心代码: register LL ans = sz[p] * 2 - 1;…
倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ]; void dfs(int x,int fa) { int i,k; vis[x]=; anc[x][]=fa; deep[x]=deep[fa]+; ;i<=log2n;i++) anc[x][i]=anc[anc[x][i-]][i-]; ;k=e[k].next) if(!vis[e[k].…
题目:https://www.luogu.org/problemnew/show/P1600 看TJ:https://blog.csdn.net/clove_unique/article/details/53427248 树上差分真好. 首先要发现向上和向下的……是定值.然后想到可以差分. 本题的差分略特殊之处在于它的对象是一条连到根的链.把链上的差分值记到非根的端点上. 总之看明白TJ之后感觉真精妙. 而且 从各种中选自己需要的 只需把所有都加进桶中! #include<iostream>…
自己yy的方法yyyyyyyy着就A了,写篇博客庆祝一下. 题目: 洛谷3181 分析: SAM(可能是)模板题(不会SAM的同学戳我:[知识总结]后缀自动机的构建). 对\(s1\)建出SAM,用\(s2\)在上面跑.用\(size[i]\)表示结点\(i\)的\(Right\)集合大小(直接拓扑排序后DP就行).既然要求\(s2\)中有多少子串在\(s1\)中出现了,那么用\(f[i]\)表示结点\(i\)对应的所有子串在\(s2\)中一共出现了多少次(位置不同算多次).答案就是\(\sum…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4592 1操作就是用线段树来二分找到第一个有 k 个0的位置. 在洛谷上A了,与暴力和网上题解对拍也都没问题.在bzoj上4msWA.不知道为什么. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define ls Ls[cr] #define rs…
画个图就能多少看出些规律 证明借鉴一下大牛的题解: 设从A到B,经过的深度最小的点为X 同理,C,D的为Y 题目是一个点从A出发到B 一个从C出发到D 那么从A到B可以分解成 先从A到X 再从X到B... C同理 假设能相遇 那么 要么在A到X的过程A,B相遇 要么在X到B的过程A,B相遇 对于在A到X的过程相遇的情况 又可以分解为: 情况1: 在A到X的过程和 C到Y的过程 中A,B相遇 此时相遇点的深度必然大于等于MIN(X深度,Y深度) 情况2: 在A到X的过程和 Y到D的过程 中A,B相…