
算法学习
算法学习
Flyzz~
这个作者很懒,什么都没留下…
展开
-
练习记录
虚树对于多组询问,且每组询问都包含树上一些不同的点的查询的树上问题可能会用到虚树。虚树的建立学习链接void add(int s){ if(!c) { vtree[++c] = s; return; } int f = query(pre[s],pre[vtree[c]]); while((c>1)&&pre[f]<pre[vtree[c-1]]) { add_edg原创 2020-12-02 12:35:57 · 157 阅读 · 0 评论 -
组合数学入门
组合数学入门卡特兰数以下摘自OI-wiki: 一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果他从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路? 在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数? 对角线不相交的情况下,将一个凸多边形区域分成三角形区域的方法数? n个结点可构造多少个不同的二叉树? ...通项公式\textbf通项公式通项公式 H(n)=(2nn)原创 2020-11-23 12:22:14 · 355 阅读 · 0 评论 -
最小直径生成树
最小直径生成树其实就是找树的绝对中心(到其他节点的最大距离最小,可证直径为绝对中心到其他节点最远距离乘2,也就是说直径两端点到绝对中心距离相等,且绝对中心可能在边上)。求绝对中心 枚举边,假设绝对中心在该边(u,v)上,边长L,设其到u的距离为x,则直径的1/2应为max(d[u][i]+x,d[v][i]+L−x)max(d[u][i]+x,d[v][i]+L-x)max(d[u][i]+x,d[v][i]+L−x),其图像如下(盗的图),要与max所以图像为实现部分,那么我们要找的值就是最低点所原创 2020-11-23 12:13:03 · 620 阅读 · 0 评论 -
无旋Treap学习
无旋Treap学习核心操作split:void split(int rt, int & a, int & b, int sz) //按size分{ if (rt == 0) { a = b = 0; return; } flip(rt); if (tree[tree[rt].lc].sz <= sz-1) { a = rt; split(tree[rt].rc, tre原创 2020-11-23 12:10:01 · 168 阅读 · 0 评论 -
前缀函数,AC自动机
前缀函数,AC自动机洛谷p2375前缀函数的应用。题目大意:我们都知道前缀函数,但现在要求求出一个更强大num数组一一对于字符串S的前i个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i]。 其实只要找出最长符合要求前缀即可,更短的一定是最长符合要求前缀的前缀,推前缀函数时求一个“前缀”和就好(即累加到最长前缀上)。如何求最长不重合既是前缀又是后缀的串呢?前缀函数求的会包含重合的,想一想最开始重合那个过程,在i-1的位置如i=7,在i=6的位原创 2020-11-23 12:09:30 · 483 阅读 · 0 评论 -
点分治模板题
洛谷模板题利用点分治复杂度约为nlogn,再加上其他操作的复杂度。总结一下:1. 每次找子树的重心作根递归进行。2. 注意各种标记vis标记回溯时需去掉。#include<bits/stdc++.h>using namespace std;const int maxn=1e4+5;//加找重心struct edge{ int to,next,w; edge(int to=0,int next=0,int w=0):to(to),next(next),w(w){}原创 2020-11-23 12:08:38 · 96 阅读 · 0 评论 -
斜率dp入门
[HNOI]玩具装箱算是斜率dp的入门题吧,记录一下自己的学习心得。S[]处理前缀和,可得状态转移方程F[i]=F[j]+(S[i]−S[j]+i−j−1−L)2,0<=j<iF[i]=F[j]+(S[i]-S[j]+i-j-1-L)^2,0<=j<iF[i]=F[j]+(S[i]−S[j]+i−j−1−L)2,0<=j<i换元简化a=S[i]+i,b=S[j]+j+L+1a=S[i]+i,b=S[j]+j+L+1a=S[i]+i,b=S[j]+j+L+1 可得F[原创 2020-08-25 11:40:31 · 180 阅读 · 0 评论 -
前缀函数学习
前缀函数在oi-wiki上学习了前缀函数,自己也总结一下。定义:pi[i]=max(j),s[0..j]=s[i−j+1,i]pi[i]=max(j),s[0..j]=s[i-j+1,i]pi[i]=max(j),s[0..j]=s[i−j+1,i]O(n)计算方法:#include<bits/stdc++.h>using namespace std;const int maxn=1e5;int p[maxn];char s[maxn];void getpi(int n){原创 2020-08-11 09:38:31 · 491 阅读 · 0 评论 -
多项式算法学习记录
多项式单纯记录一下拉格朗日插值大佬博客链接f(k)=∑i=0nyi∏i≠jk−x[j]x[i]−x[j]f(k) = \sum_{i = 0}^{n} y_i \prod_{i \not = j} \frac{k - x[j]}{x[i] - x[j]}f(k)=i=0∑nyii=j∏x[i]−x[j]k−x[j]普通拉格朗日插值代码如下ll x[maxn],y[maxn];ll solve(int n,ll k){ ll ans=0; for(int原创 2020-07-23 20:30:10 · 139 阅读 · 0 评论 -
暑期培训:数论总结
只是单纯记录一下结论1.裴蜀定理:对于给定的正整数a,b,方程ax+by=c有解的充要条件为c是gcd(a,b)的整数倍。定理的推广: 方程ax+by+cz+…+nm=f(其中a,b,c…n,f为整数)有解的充要条件是f为gcd(a,b,c,…,n)的整数倍。2.扩展欧几里得算法:可以求出两个整数x,y,使其满足ax+by=d,d为gcd(a,b).在此前提下使|x|+|y|最小,算法可以求出一组特解,通解为:x=x+k∗bdy=y−k∗ad x=x+k*\frac{b}{d}\qquad y=y-k原创 2020-06-21 22:35:39 · 306 阅读 · 1 评论