- 博客(11)
- 收藏
- 关注
原创 【模板】树链剖分
原文相当于把树上的链抽出来变成区间进行操作。重链剖分(本文重点):本文依照P3384 【模板】轻重链剖分/树链剖分的实现进行讲解。就是剖分出重链覆盖全树。重链:除开头的端点为轻儿子外,其他节点全为重儿子的链。重儿子:一个节点的儿子中子树大小最大的儿子。要进行树链剖分,先要进行预处理。需要处理出以下信息:top[u]top[u]top[u] u节点所在重链的开头端点的编号。dep[u]dep[u]dep[u] u节点的深度。fa[u]fa[u]fa[u] u节点的父亲节点的编号。dfn
2021-10-09 22:02:56
87
原创 【模板】树链剖分LCA
原文在用树剖解决问题时发现,每次跳链的时候,就有跳到两点LCA的可能。所以还是有之前树剖的思想,其实和倍增的LCA很像。优点:常数小,实现很好理解也很好写。预处理复杂度O(n)O(n)O(n),查询O(log n)O(log\ n)O(log n),附带常数小。感觉比倍增好写,而且还快。实现如下:(预处理点这里)inline void Swap(int &x,int &y){ int tmp=x;x=y;y=tmp;}int LCA(int x,int
2021-10-09 22:02:10
97
原创 【模板】st表
原文我们可以令f[i][j]f[i][j]f[i][j]表示区间[i,i+2j−1][i,i+2^{j}-1][i,i+2j−1]的最大值(最小值同理)所以有f[i][j]=max(f[i][j−1],f[i+2j−1][j−1])f[i][j]=max(f[i][j-1],f[i+2^{j-1}][j-1])f[i][j]=max(f[i][j−1],f[i+2j−1][j−1])(根据上面的定义可以得出)注:可以预处理出log2数组,进一步卡常。#include<bits/stdc++.
2021-10-09 22:01:24
105
原创 【模板】权值线段树(值域线段树)
原文顾名思义,维护权值的线段树。在一定情况下可以代替平衡树使用。原理是用线段树维护桶,节点维护子树中数的个数。所以空间开销与数据的值域相关。那要是值域过大怎么办:离散化和动态开点,离散化可以将数据值域缩小到数据数量,将空间复杂度变为 O(n)O(n)O(n),缺点是需要离线。而需要在线则需支持动态开点,即用多少开多少。动态开点线段树权值线段树:支持平衡树操作(翻转除外),并附带离散化P3369普通平衡树#include<bits/stdc++.h>using namespace
2021-10-09 22:00:29
533
原创 【模板】模拟退火
原文由于算法基于随机,不适宜作为题目正解,但在参数调得好的时候可以得到较高分数甚至AC,用于实在迫于无奈时的算法或暴力算法范围外的骗分算法典型的邪教算法(我就喜欢邪教的)基本思想是随机转移,从而确定最优解,大多数用于计算几何(但其实你如果够牛也可以在其他情况下用来骗分)基本的实现步骤是:1.取一个经验总结下的可能性较大的最优解(贪心或不正经结论)2.按照当前选择的解进行转移,并设定较为科学的转移幅度3.求出当前随机解的贡献,然后按照最优解必选、一定概率接受劣解的原则选取解4.设置好初始温度,
2021-10-09 21:58:06
326
原创 【模板】高斯消元
原文对于不用区分无解和无数解的情况下,采用高斯-约旦消元法优点:1.回带比原版高斯消元少,速度更快(一般情况下)2.精度更好3.代码实现更简单代码如下:模板P3389#include<bits/stdc++.h>using namespace std;#define file(a) freopen(#a".in","r",stdin),freopen(#a".out","w",stdout)#define N 110#define eps 1e-7int n;
2021-10-09 21:57:11
83
原创 【模板】manacher
原文我们在原字符串中间添加 # 使得 manacher 可以同时处理奇偶回文我们对于每一个 i ,若其未超出最大匹配到的范围,则使其按照区间内对称点对称,并按照其对称点的回文长度以及当前 i 到区间右端点取最小值更新当前 i 的回文长度。否则归为 1 。之后朴素算法更新答案,由于中间的那一个字符(包括 #)的对称点是其自身,所以更新后长度要减一。最后如果得到更远的回文范围我们就对范围进行更新。#include<bits/stdc++.h>using namespace std;char
2021-10-09 21:55:37
57
原创 题解 CF1095F 【Make It Connected】
题意简述nnn( 1≤n≤2×1051≤n≤2×10^51≤n≤2×105 )个点,每个点 iii 有一个点权 aia_iai ( 1≤ai≤2×10121≤a_i≤2×10^{12}1≤ai≤2×1012 ),将两个点 iii,jjj 直接相连的花费是两个点的点权和 ai+aja_i+a_jai+aj,并且对于特别的mmm( 1≤m≤2×1051≤m≤2×10^51≤m≤2×105 )条边 uiu_iui , viv_ivi 可以通过花费 www 点费用连接,求使得所有点互相连通的最小费用。
2021-10-09 21:53:12
111
原创 分类链接层
原文NOI大纲基础操作读入输出快读快写图论存图链式前向星排序算法三路快排+随机化初步数据结构基础数据结构并查集ST表按秩合并并查集带权并查集Hash表树状数据结构线段树树状数组左偏树动态开点线段树线段树合并线段树分裂可持久化线段树异或数据结构01trie线性基平衡树FHQ treap替罪羊Splay权值线段树图论树上问题最小生成树树链剖分树上差分Dsu on tree点分治点分树LCA专题倍增LCA树链剖分LCAST表LC
2021-10-09 21:49:01
75
原创 [模板]链式前向星
#include<bits/stdc++.h>using namespace std;int n,m;vector<bool>vis;vector<int>head,next,to,val;/*head[i]存储以i为起点的第一条边的编号next[i]存储编号为i的边的同起点的下一条边to[i]存储编号为i的边所连向的点的编号val[i]存储编号为i的边的边权*/void add(int u,int v,long long w){ next.pu
2020-07-31 18:03:15
210
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人