【LNOI 2014】 LCA】的更多相关文章

[题目链接] 点击打开链接 [算法] 考虑求lca(x,y)的深度 我们可以将从根到x路径上的点都打上标记,然后,询问y到根上路径的权值和 那么,求sigma(depth(lca(i,z)))(l <= i <= r ),我们可以将区间[l,r]中的点依次打上标记,然后,询问点z到根路径 上的权值和 因为此题有多组询问,显然在线很难做,因此,我们考虑离线计算答案 求sigma(depth(lca(i,z))) (l <= i <= r),我们可以转化为 sigma(depth(lc…
[题目链接] 点击打开链接 [算法] 树链剖分 每个宗教建一棵线段树,注意数据量大,要动态开点 [代码] #include<bits/stdc++.h> using namespace std; #define MAXLOG 18 ; ; int i,n,q,x,y,t,Lca,SZ,timer; int w[MAXN],c[MAXN],son[MAXN],dfn[MAXN],top[MAXN],size[MAXN],anc[MAXN][MAXLOG], dep[MAXN],fa[MAXN],…
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3631 [算法] 树上差分 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 300010 #define MAXLOG 20 int i,n,u,v,Lca; int a[MAXN],dep[MAXN],cnt[MAXN]; int anc[MAXN][MAXLOG]; vector< int &g…
[题目链接] 点击打开链接 [算法] 按x轴排序,将相邻点连边 按y轴排序,将相邻点连边 然后对这个图跑最短路就可以了,笔者用的是dijkstra算法 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 200000 struct info { int id,x,y; } a[MAXN+]; int N,i; ]; vector< pair<]; template <typename T> inl…
[题目链接] 点击打开链接 [算法] 线段树 注意标记下传 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 500000 typedef long long LL; struct SegTreeNode { LL l,r,sum,lazya,lazyb; }tree[MAXN+]; LL i,N,P,Q,l,r,x,opt; LL a[MAXN+]; template <typename T> void…
[题目链接] 点击打开链接 [算法] 先考虑50分的做法 : f[i]表示以i结尾的本质不同的上升子序列的个数 则f[i] = sigma(f[j]) (j < i,a[j] < a[i]),注意如果a[j]不止一个,只需加上下标最大的即可,否则会重复计数 那么,100分的做法,其实就是用树状数组来优化这个东西,注意因为a[i]最大10^9,所以要离散化 [代码] #include<bits/stdc++.h> using namespace std; ; ; int i,n,an…
[题目链接]            点击打开链接 [算法]            sum[i]表示前i个杯子中,杯子底下藏有球的杯子总数            那么,知道[i,j]这段区间中,藏有球的杯子总数的奇偶性,相当于知道sum[j] - sum[i-1]的奇偶性            我们发现,知道哪些杯子底下藏有球,就是需要我们知道所有sum[i]的奇偶性            因此,我们只需将所有的(i-1,j)连边,边权为输入数据中给出的费用c(i,j),然后,求出这个图的最小  …
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3670 [算法] KMP [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 1000010 ; int T,i,j,ans,len,tmp; int num[MAXN],nxt[MAXN],cnt[MAXN]; char s[MAXN]; int main() { scanf("%d",…
在一棵树上 求2个点的最短距离.那么首先利用LCA找到2个点的近期公共祖先 公式:ans = dis(x) + dis(y) - 2 * dis(lca(x,y)) 这里的dis(x)指的上x距离根节点的距离 注意一些细节方面,比方数组的越界问题: #include<cstdio> #include<vector> #include<cstring> #include<algorithm> using namespace std; typedef long…
Luogu P3379 题意:对于两个节点,寻找他们的最近公共祖先. 一个显而易见的解法是对于每一个节点我们都往上遍历一遍,记录下它每一个祖先,然后再从另一个节点出发,一步一步往上走,找到以前记录过第一个节点就是这两个节点的LCA 事实上在这样的数据规模下,这种解法的时间复杂度是让人无法接受的. 很容易发现,这样的解法慢在两个节点是一步一步往上走的,也许可以想个办法一次跳一大步? 于是我们引入了倍增法求LCA. 我们知道,对于任意一个整数数,都可以使用\(2^k+2^{k-1}+...+2^0\…
LCA模板题https://www.luogu.com.cn/problem/P3379题意理解 对于有根树T的两个结点u.v,最近公共祖先LCA(u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能小.另一种理解方式是把T理解为一个无向无环图,而LCA(u,v)即u到v的最短路上深度最小的点.例如,对于下面的树,结点4和结点6的最近公共祖先LCA(T,4,6)为结点2. 那么这里提供四种思路. 1.暴力至上主义 首先计算出结点u和v的深度d1和d2.如果d1>d2,将u结点向上移动d1…
(7.16晚)更完先在B站颓一会儿-- --------------------------------------------------------------- (以下为luogu题面) 题目描述 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先. 有q次询问,每次询问给出l r z,求∑(l≤i≤r ​dep[LCA(i,z)]) 输入输出格式 输入格式: 第一行2…
http://www.lydsy.com/JudgeOnline/problem.php?id=3876 这道题每条支线的意思是每条边... 那么每条边的下界设为1就行了. 这样建出一个DAG,每条边下界为1,上界为正无穷,赋上费用.设1为S.所有点向T连边,下界为0,上界为正无穷,费用为0,表示可以随时退出.答案是这个图中的最小费用可行流. 最小费用可行流怎么求啊! 可行流什么的我只会求无源汇的. 想了好半天才明白该怎么做... 抛弃原来的建图,还是建出一个DAG,每条边下界为1,上界为正无穷…
http://uoj.ac/problem/29 cdq四次处理出一直向左, 一直向右, 向左后回到起点, 向右后回到起点的dp数组,最后统计答案. 举例:\(fi\)表示一直向右走i天能参观的最多景点数. 其中有一个很重要的条件\(fi≤fi+1fi≤fi+1\),这个条件是分治的前提. 关于这个条件的证明,我想了好久才想出来,用反证法证明一下就行. 分治时需要用主席树维护路径上的前k大和. #include<cstdio> #include<cstring> #include&…
http://www.lydsy.com/JudgeOnline/problem.php?id=3672 http://uoj.ac/problem/7 链上的情况可以用斜率优化dp.树上用斜率优化dp时,单调队列的复杂度是均摊$O(n)$的,所以放到树上做“可持久化单调队列”复杂度是$O(n^2)$的,所以不能树上斜率优化. 这道题可以用树链剖分(时间复杂度$O(nlog^3n)$)或者点分治套cdq分治(时间复杂度$O(nlog^2n)$).因为树链剖分感觉比较难写,而且每个节点用vecto…
http://uoj.ac/problem/20 并不会做...然后看题解....... 对a取模,避免了高精度带来的复杂度,然后再枚举x判断是否满足模意义下等于0. 取5个模数,我直接抄的别人的_(┐「ε:)_.时间复杂度$O(nm)$. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int p[5] = {11261,19997,22877,2189…
http://uoj.ac/problem/17 dp,注意细节. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int in() { int k = 0, fh = 1; char c = getchar(); for(; c < '0' || c > '9'; c = getchar()) if (c == '-') fh = -1; for(; c…
代换一下变成多项式卷积,这里是的答案是两个卷积相减,FFT求一下两个卷积就可以啦 详细的题解:http://www.cnblogs.com/iwtwiioi/p/4126284.html #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 500003; const double Pi = acos(…
看Yveh的题解,这道题卡了好长时间,一直不明白为什么要······算了当时太naive我现在都不好意思说了 #include<cstdio> #include<cstring> #include<algorithm> #define read(x) x=getint() using namespace std; const int N = 1E5; int getint() { int k = 0, fh = 1; char c = getchar(); for(;…
因为有$10^5$个宗教,需要开$10^5$个线段树. 平时开的线段树是“满”二叉树,但在这个题中代表一个宗教的线段树管辖的区间有很多点都不属于这个宗教,也就不用“把枝叶伸到这个点上”,所以这样用类似主席树的数组动态开点来建立$10^5$个只有几个“树枝”的线段树,维护轻重链就可以了 线段树的$L,R,l,r$弄反了调了好久$QAQ$ $so$ $sad$ #include<cstdio> #include<cstring> #include<algorithm> #d…
$LCT+枚举$ 复习一下$LCT$模板. 先以$Ai$为关键字$sort$,然后$Ai$从小到大枚举每条边,看能否构成环,构不成则加边,构成则判断,判断过了就切断$Bi$最大的边. 我的边是编号为$i+n$的点,忘了这点调了好久$QAQ$ $sosad$ #include<cstdio> #include<cstring> #include<algorithm> #define N 150003 #define read(x) x=getint() using nam…
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 http://uoj.ac/problem/5 可以建出"KMP自动机"然后在树上二分或单调计算. 也可以不建树,每个位置维护fail指针和nxt指针. nxt指针指的是在小于等于当前位置除以2的fail指针能跳到的最大的位置,都可以\(O(n)\)维护. #include<cstdio> #include<cstring> #include<algo…
Description 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的: 1.在一个 n*m 棋盘上有 n*m 个格子,其中有且只有一个格子是空白的,其余 n*m-1个格子上每个格子上有一个棋子,每个棋子的大小都是 1*1 的: 2.有些棋子是固定的,有些棋子则是可以移动的: 3.任何与空白的格子相邻(有公共的边)…
DP 唉我还是too naive 这是个整数划分题…… 我想的DP方式是f[i][j][k]表示前 i 个数拼出 j 用了 k 个数的方案数…… 转移当然是比较直观…… 但是只能得30分QAQ 正确的DP姿势:http://blog.csdn.net/Vmurder/article/details/42551603 分析: 数据范围不大,我们可以写整数划分. f[i][j]表示将i划分成j个互不相同的正整数,且最大不超过n 的划分方案数. 这里说一下这道题的整数划分. 我们不妨先来反向思考一下.…
http://uoj.ac/problem/104 此题的重点是答案只与切割的最终形态有关,与切割顺序无关. 设\(f(i,j)\)表示前\(i\)个元素切成\(j\)个能产生的最大贡献. \(f(i,j)=\max\{f(k,j-1)+sum(k+1,i)(sum(1,n)-sum(k+1,i)),k<i\}\),其中\(sum(l,r)=\sum\limits_{i=l}^ra_i,sum_k=\sum\limits_{i=1}^ka_i\) 有决策点\(k\)和\(l\),当\(k<l\…
http://uoj.ac/problem/103 由manacher得:本质不同的回文串只有\(O(n)\)个. 用manacher求出所有本质不同的回文串,对每个本质不同的回文串,在后缀自动机的parent树上倍增求一下它出现了多少次,更新答案. 时间复杂度\(O(n\log n)\). #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long l…
http://www.lydsy.com/JudgeOnline/problem.php?id=3530 上午gty的测试题,爆0了qwq 类似文本生成器那道题,把AC自动机的转移建出来,准确地说建出了一个Trie图,然后在上面dp就可以了. 这道题因为有小于等于n的限制,所以要用类似数位dp的方法,记录卡不卡上界两个状态来转移. #include<cstdio> #include<cstring> #include<algorithm> using namespace…
Problem Description 给出 \(n\) 个数 \(q_i\),给出 \(F_j\) 的定义如下: \[F_j=\sum_{i<j} \frac{q_iq_j}{(i-j)^2} - \sum_{i>j} \frac{q_iq_j}{(i-j)^2}\] 令 \(E_i=F_i/q_i\),求 \(E_i\). Input Format 第一行一个整数\(n\). 接下来 \(n\) 行每行输入一个数,第 \(i\) 行表示 \(q_i\). Output Format \(n…
题意 https://loj.ac/problem/2193 题解 ​显然就是求 $\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} \sigma_1(\gcd{(i,j)}) [\gcd(i,j)\le a]$($\sigma_1(x)$ 表示求 $x$ 的所有约数之和),看到 $\gcd$ 就知道是莫比乌斯反演基础题吧 如果不考虑 $a$ 的限制,这就是推一遍莫反的模板题,那先不考虑,则原式变为$$\sum\limits_{i=1}^{n} \sum\l…
[模板·I]LCA(倍增版) 既然是一篇重点在于介绍.分析一个模板的Blog,作者将主要分析其原理,可能会比较无趣……(提供C++模板) 另外,给reader们介绍另外一篇非常不错的Blog(我就是从那篇博客开始自学LCA的):+LCA-by 殇雪+ 一.原理 LCA即最近公共祖先,一般用LCA(u,v)表示u.v的最近公共祖先.举个例子: (Tab:以下“树”均指有根树)由于在树中,除根节点的每个节点都有且仅有一个父节点,我们很容易得到一个结论——u,v的最近公共祖先的任意祖先一定也是u,v的…