![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
模板
文章平均质量分 60
Linda_yezi_coder
这个作者很懒,什么都没留下…
展开
-
树上启发式合并(dsu on tree)
dsudsu是并查集的意思,但是dsu on tree和并查集没什么关系。主要是借助并查集的思想,在树上进行一个合并。解决什么问题树上的问题大体可分两种,子树问题和树链问题。树链问题可以用树链剖分来做,dsu on tree主要是解决不修改的子树问题。核心思想将轻子树往重子树上合并,删除轻子树的贡献。什么是轻子树和重子树我们定义轻子树是轻儿子所在的子树,重子树是重儿子所在的子树。具体做法处理轻子树及其子树的答案处理重子树及其子树的贡献,并不删除贡献暴力统计所有轻子树及其子树的贡献与上原创 2021-08-27 14:20:19 · 129 阅读 · 0 评论 -
dfs序与树链剖分
dfs序dfs序是对于一棵树而言,我们dfs的顺序。主要目的是用于对一棵树上的结点形成一个数组,可以用于建线段树等操作。在dfs序中,每个节点只出现一次(欧拉序每个节点出现两次)。比如者一棵树的dfs序为 ABCDEF时间戳每个节点第一次被访问的时间dfs序的性质父节点的时间戳小于子节点的时间戳树链剖分可以解决的问题对于树上两个节点 u,vu, vu,v1、将路径 uuu 到 vvv 上的点都加上一个值2、求路径 uuu 到 vvv 所有点的权值和3、将节点 uuu 为根的子原创 2021-08-24 22:01:45 · 166 阅读 · 0 评论 -
2021牛客多校第二场 A——Arithmetic Progression
题目大意给你一个长度为 nnn 的数列 aaa ,数列中每个元素都不一样,问你存在多少个区间,这些区间内的数排序后是一个等差数列解题思路对于一个区间,如果这个区间内的数排序后的元素可以构成一个等差序列,那么一定满足下列性质max−min=(r−l)×gcdmax - min = (r - l) \times gcdmax−min=(r−l)×gcd其中 gcdgcdgcd 是区间差分绝对值的最大公约数minminmin 是区间的最小值maxmaxmax 是区间的最大值我们做这题的思想是,枚举原创 2021-08-12 00:17:58 · 307 阅读 · 0 评论 -
小圆前辈的素数——FFT
题目大意给你两组数第一组 nnn 个, 第二组 mmm 个,在第一组数中选一个数,第二组数中选一个数,问你这两个数之和是素数有多少种选法解题思路暴力的方法:遍历第一组,然后遍历第二组,进行判断,复杂度 O(n∗m)O(n * m)O(n∗m) 对于数据量大于 10510^5105 的问题显然无法解决。FFT:我们用两个桶来记录第一二组数,然后对两个桶进行FFTA(x)=xa1+xa2+xa3......xanB(x)=xb1+xb2+xb3......xbmA(x) = x^{a_1} +原创 2021-08-08 20:44:48 · 140 阅读 · 0 评论 -
树上最长上升子序列——线段树合并
模板求一棵树上的最长上升子序列的长度解法线段树合并我们对于树上每一个点 xxx,发现经过它的一条路径LIS由两部分组成。以 xxx 开头的左子树最长上升子序列 + 右子树最长下降子序列 - 1以 xxx 开头的左子树最长下降子序列 + 右子树最长上升子序列 - 1一开始所有点的 LISLISLIS 和 LDSLDSLDS 都是1,我们从底向上合并答案首先dfs到底,然后向上回溯Code#include <bits/stdc++.h>#define ll long long原创 2021-08-05 10:22:23 · 756 阅读 · 0 评论 -
连续子段和最大,连续子段平均数最大
连续子段和最大求一个子段,它的和最大,我们只需要O(n)O(n)O(n)扫一遍这个数列,不断把新的数加入子段,当子段和变为负数时,把当前整个子段清空,边扫描边记录最大值,这样我们就得到了答案int ans = -inf;int sum = 0;for(int i = 1; i <= n; i++){ sum += a[i]; ans = max(ans, sum); if(sum < 0) sum = 0;}连续子段和最大且子段长度不小于L原创 2021-07-30 16:42:51 · 496 阅读 · 0 评论 -
动态开点与线段树合并
权值线段树在一些计数问题中,线段树用于维护值域(一段权值范围),这样的线段树也称为权值线段树。动态开点为了降低空间复杂度,我们可以不建出整棵线段树的结构,而是在最初只建立一个根节点,代表一整个区间,当需要访问线段树的某棵子树时,再建立代表这个子区间的结点。采用这种方法维护的线段树称为动态开点线段树。动态开点线段树抛弃了完全二叉树父子结点二倍的编号原则,改为用变量记录左右子节点编号建立线段树codestruct Tree{ int l, r; int dat;}tree[MAXN原创 2021-07-30 10:42:17 · 177 阅读 · 0 评论 -
动态规划——斜率优化
斜率优化问题print article容易想到用dp[i]来表示打印前i个单词的最小花费先预处理一下前缀和sum[i] = sum[i-1] + c[i] 后面用起来比较方便转移方程为:dp[i] = dp[j] + (sum[i] - sum[j])^2 + m (j < i)但是这样比较麻烦,复杂度为O(n^2) 会超时事实上有很多点根本用不上, 与后面点比起来任何时候都没有优势,这样的点我们应该及时去掉,避免重复运算不妨设 k < j若dp[j] + (sum[i] -原创 2020-08-07 22:54:51 · 174 阅读 · 0 评论 -
C++——STL的set与map简单使用
set容器1、set是有顺序的集合,其中没有重复元素2、迭代器命名方式:set< int >::iterator it = set.begin();3、set.count(data)用于判断data是否为其中的元素如果是则返回14、set.empty()判断集合是否为空,如果为空返回15、set.find(data)返回数据data的迭代器,如果没有这个数据则返回倒数第二个...原创 2020-02-07 22:14:14 · 282 阅读 · 0 评论 -
map容器按值(value)排序
众所周知,map映射是(key-value)的形式,map自带为key排序,但是很多时候我们想让map按value排序,这时,我们可以借助vectorbool cmp(const PAIR& x, const PAIR& y){ return x.second > y.second //降序 }typedef pair<string, int> PA...原创 2020-02-29 21:52:44 · 919 阅读 · 0 评论 -
【模板】——素数筛法
1.埃拉托斯特尼筛法太难记简称——埃氏筛复杂度O(nloglogn)const int MAXN = 100007;bool cheak[MAXN];//素数为false int prime[MAXN];//存第i个素数的值 int cnt;//素数个数 void Prime(){ for(int i = 2; i <= MAXN; i++) { if(!cheak...原创 2020-02-12 21:50:06 · 126 阅读 · 0 评论 -
【模板】——线段树(求和)
线段树是一种二叉树可以用数组来实现存储需要的空间为n往上的2^n取整再乘以2如 28 -> 32 x 2 -> 64足够了我们规定根节点为1发现每个节点的左子节点为父节点的两倍,右子节点为父节点的两倍加一void pushup(int rt)//更新父节点 { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];...原创 2020-02-11 19:41:17 · 162 阅读 · 0 评论 -
【模板】——快速幂、取模快速幂
计算2^35方法第一种ll sum = 1;for(int i = 1; i <= 35; i++){ sum *= 2;}//计算了35次,不够快快速幂的方法把235 = 232+2+1用到位运算 35 = 100011我们这样写代码ll quickmi(int a, int b) //a的b次方 { ll ans = 1; while(b) { ...原创 2020-02-12 21:30:10 · 157 阅读 · 0 评论