题意:一个带点权的森林,要求维护以下操作: 1.询问路径上的点权K大值 2.两点之间连边 n,m<=80000 思路:如果树的结构不发生变化只需要维护DFS序 现在因为树的结构发生变化,要将两棵树合并,这步可以用启发式合并,将比较小的树暴力连接到较大的树上面 离线的LCA算法无法维护,而倍增可以合并,所以用倍增求LCA 其余就是主席树,维护根到点的权值线段树就行了 机房里的罗爷爷写法比我高到不知道哪里去了 #include<cstdio> #include<algorithm>…
森林 bzoj-3123 Sdoi-2013 题目大意:给定一片共n个点的森林,T个操作,支持:连接两个不在一棵树上的两个点:查询一棵树上路径k小值. 注释:$1\le n,T \le 8\cdot 10^4$ 想法:运用冯老师讲的方法: “对于一个开起来非常困难的问题,我们可以通过先构造拟对象,然后向完全对象转化” 这个题,我们看到了最后一个操作,想到了主席树. 两个点x.y之间的路径,我们在主席树上用root[x]+root[y]-root[lca(x,y)]-root[fa[lca(x,y…
题面传送门 wssb,我紫菜 看到这类与最大值统计有关的问题可以很自然地想到分治,考虑对 \([l,r]\) 进行分治,求出对于所有 \(l\le x\le y\le r\) 的点对 \((x,y)\) 的贡献之和.若 \(l=r\) 那只有 \(a_l=1\) 的情况会产生贡献,特判一下并直接返回即可.若 \(l\ne r\),我们假设 \([l,r]\) 中最大值的位置为 \(mid\),考虑将所有符合要求的点对分成三部分,一是 \(l\le x\le y<mid\),二是 \(mid<x…
题目描述 输入 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数表示 N个节点上的权值.  接下来 M行,每行包含两个整数x和 y,表示初始的时候,点x和点y 之间有一条无向边, 接下来 T行,每行描述一个操作,格式为“Q x y k”或者“L x y ”,其含义见题目描述部分. 输出 对于每一个第一类操作,输出一个非负整数表示答案. 样例输入 1 8 4…
题目链接 luoguP3302 [SDOI2013]森林 题解 本来这题树上主席树暴力启发式合并就完了 结果把lca写错了... 以后再也不这么写了 复杂度\(O(nlog^2n)\) "for(int i = 0;dad[x][i];++ i) dad[x][i+1] = dad[dad[x][i]][i]" De了两个多小时....QAQ 代码 #include<cstdio> #include<cstring> #include<algorithm&…
传送门 据说离线做法是主席树上树+启发式合并(然而我并不会) 据说bzoj上有强制在线版本只能用克鲁斯卡尔重构树,那就好好讲一下好了 这里先感谢LadyLex大佬的博客->这里 克鲁斯卡尔重构树可以用来解决一类诸如“查询从某个点出发经过边权不超过val的边所能到达的节点”的问题 首先不难发现,上面这个问题肯定是在最小生成树上走最优,其他边都可以不用去管 那么我们就在建最小生成树的时候搞事情 克鲁斯卡尔重构树的思想就是在建最小生成树的时候不是直接连边,而是新建一个节点,并把这个节点的值设为边权,然…
题目 [题目描述] 有一个长度为 $n$ 的序列 $a_1, a_2, \dots, a_n$,一开始每个位置都是白色.如果一个区间中每个位置都是白色,则称这是一个白白的区间.如果一个白白的区间向左或向右延长后都不是白白的区间了,则称这是一个极长的白白的区间.有 $q$ 次操作,每次操作会修改某个位置的值,或者把某个位置变成黑色.每次操作后,求所有极长的白白的区间中含有的逆序对数的异或和.强制在线. [输入格式] 第一行两个正整数 $n, q$. 第二行 $n$ 个正整数 $a_1, a_2,…
题意: 有n个位置,每个位置上的数字是a[i],现在有强制在线的若干个单点删除操作,每次删除的位置都不同,要求每次删除之后求出最大的连续区间逆序对个数 n<=1e5,1<=a[i]<=n 思路: 对于每次删除操作我们可以考虑被删除的数字的贡献 比如区间[l,r]内删除了x这个位置,被分成了[l,x-1]与[x+1,r]两个区间 未删除之前区间总逆序对数可以分为4个部分:[l,x-1]内部,[x+1,r]内部,跨区间,一端为x 一个优秀的结论是内部区间和跨区间部分可以选择两端区间内较小的一…
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数表示 N个节点上的权值.  接下来 M行,每行包含两个整数x和 y,表示初始的时候,点x和点y 之间有一条无向边, 接下来 T行,每行描述一个操作,格式为“Q x y k”或者“L x y ”,其含义见题目描述部分. Output 对于每一个第一类操作,输出一个非负整数表示答…
3123: [Sdoi2013]森林 题意:一个森林,加边,询问路径上k小值.保证任意时刻是森林 LCT没法搞,树上kth肯定要用树上主席树 加边?启发式合并就好了,小的树dfs重建一下 注意 测试点编号不是数据组数!!! 加边的时候要更新邻接链表啊,并且fa要清空 并查集维护size一定初始化1 好了现在我要填报名表了 #include <iostream> #include <cstdio> #include <cstring> #include <algor…