随笔分类 -  算法blogs

计算几何超详细板子
摘要:定义 点与向量 struct Point { double x, y; Point() {} Point(double x, double y) :x(x), y(y) {} }; typedef Point Vector; 线段与直线 struct Segment { Point a, b; Se 阅读全文
posted @ 2021-05-18 21:41 ArrogHie 阅读(1654) 评论(0) 推荐(1)
乱搞算法
摘要:爬山算法 对于单峰函数可行 实现: 先随机一个答案,之后每次将其与与其在一定范围内相邻的答案选举一个最优解,每一次运算后范围逐渐缩小,直到范围小于阈值 例题:[JSOI2008]球形空间产生器 #include<cstdio> #include<cstring> #include<cmath> #i 阅读全文
posted @ 2021-05-12 21:00 ArrogHie 阅读(130) 评论(0) 推荐(0)
数据结构学习笔记
摘要:左偏树(可并堆) 定义$dis_x$为$x$节点到最近的叶子节点的距离$+1$,每个节点的左儿子的$dis$比右儿子大,故每个节点的$dis=dis_rson+1$ 核心操作:合并 //小根堆 int merge(int x, int y)//将y并到x的子树内 { if (!x || !y) re 阅读全文
posted @ 2021-04-22 21:32 ArrogHie 阅读(111) 评论(0) 推荐(0)
网络流详细总结
摘要:EK算法求最大流 $O(nm^2)$ inline void add(int a, int b, int c) { edge.pb(Edge(a, b, c, 0)); edge.pb(Edge(b, a, 0, 0)); int siz = edge.size(); G[a].pb(siz - 2 阅读全文
posted @ 2021-03-23 20:38 ArrogHie 阅读(143) 评论(0) 推荐(0)
字符串算法总结
摘要:KMP 求border for (int i = 2, j = 0; i <= m; i++) { while (b[i] != b[j + 1] && j) j = nex[j]; if (b[i] == b[j + 1]) j++; nex[i] = j; } AC自动机 自动AC的机器 相当于 阅读全文
posted @ 2020-12-29 22:26 ArrogHie 阅读(236) 评论(0) 推荐(0)
数学数论学习笔记
摘要:平方和公式 $\sum n^2=\frac{n*(n+1)*(2n+1)}{6}$ 立方和公式 $\sum n^3=(\frac{n*(n+1)}{2})^2$ 一些推导 $\sum_{i}^{n}\sum_{j}^{n}ij=\sum_{i}^{n}i^3$ 证明:对于一个$i$,它对答案的贡献为 阅读全文
posted @ 2020-12-24 22:36 ArrogHie 阅读(327) 评论(0) 推荐(0)
平衡树学习总结、LCT练习题
摘要:Splay: 像BST(二叉搜索树)一样插入查询,可以改变树的形状,可以区间翻转,可以实现动态树,不可持久化。 核心代码: 1 void rotate(int a) // 旋转 2 { 3 int b = fa[a], c = fa[b]; 4 int k = son[b][1] == a, w = 阅读全文
posted @ 2020-07-17 22:24 ArrogHie 阅读(374) 评论(0) 推荐(0)
树上倍增、树分治学习总结
摘要:树上倍增: 核心: F[u][i] 表示u节点往上走2i步到达的祖先节点,F[u][0]=fa[u],F[u][i]=F[F[u][i-1]][i-1],其他需要维护的数值也与此格式类似 【SCOI2016】幸运数字(题目): 倍增时合并一下线性基即可 1 #include<cstdio> 2 #i 阅读全文
posted @ 2020-07-14 17:00 ArrogHie 阅读(276) 评论(0) 推荐(0)
树链剖分,LCT学习总结
摘要:概念: 对于一棵有根树,每个非叶节点选择至多一个连向孩子的边称为 “实边”(重边) ,这个边集称为这棵树的一个链剖分,不在集合中的边称为“虚边“(轻边)。如图,黑边为重边,白边为轻边。 重链: 每个非叶节点向他的节点数最大的子节点连一条重边; 重链求LCA: 如果两个点在同一条链上,则深度小的为答案 阅读全文
posted @ 2020-07-03 09:15 ArrogHie 阅读(507) 评论(0) 推荐(1)
线段树学习总结
摘要:线段树用途: 用于区间修改与求和: 区间修改: 修改l到r之间的值 , 遍历线段树 , 若某个子节点l<=L && R<=r ,则在该节点上标记修改的值 , 访问该节点及他的子节点时再将标记下传; 线段树可持久化: 核心: 永远不修改节点上的值 , 只会新建节点 ; 实现: 每当修改值的时候 , 新 阅读全文
posted @ 2020-06-29 22:18 ArrogHie 阅读(325) 评论(0) 推荐(0)