
芝士好吃
文章平均质量分 62
yryryryrr
「最低限度都没有做到的人,没有资格去羡慕有才能的人。无法成功的人正是因为想不到成功的人花费了多少心血,才无法成功的啊!」——雪之下雪乃
展开
-
欧拉道路全集
前言怎么说,真的就是????王定义欧拉道路什么叫做欧拉道路,其实就是一笔画完整个图的所有边,并且不可以重复走同一条边。欧拉回路就是起点和终点相同的欧拉道路,注意欧拉回路也属于欧拉道路欧拉图有欧拉回路的图我们叫做欧拉图。半欧拉图有欧拉道路的图,我们叫做半欧拉图。判断判断欧拉道路,也就是半欧拉图对于有向图,充分必要条件是,整个图联通,并有且只有两个度为奇数的点,一个入度比出度大一,另外一个相反。这两个也就是欧拉道路的起点和终点。对于无向图,充分必要条件是 ,整个图联通,并有且只有两原创 2021-12-04 17:16:32 · 572 阅读 · 0 评论 -
整除分块推式子
前言最近在学莫比乌斯反演,所以先学一下前置的知识。证明加内容这就是整除分块了,注意那里是下取整。之后我们会了 这个够吗?不够我们还要会把它应用。杂题已知正整数n,a,b,求∑i=1nnai+b\quad \sum_{i=1}^{n}\frac{n}{ai+b}∑i=1nai+bn下取整如何做嘞还是之前的证明思路两种方法都要会哦例二计算∑i=1nni2\quad \sum_{i=1}^{n} \frac{n}{i^2}∑i=1ni2n下取整先去自己推一下吧例题三计原创 2021-11-17 21:13:16 · 246 阅读 · 0 评论 -
扫描线扫走你的不开心
前言一个脱了好久的算法,其实不是很难,只不过之前属实是懒死了,就没去学,上一次模拟赛吃亏了,现在来补一下解决啥其实就是二位平面上的面积问题等等,其实好像二位数点也可以做2正文首先我们考虑一下如何去暴力的做这道题,是不是大概就是递归之类的其实我们可以发现,这个题目难在我们有两个维度,那么我们就考虑把一维放入线段树里面去,因为线段树维护的就是区间信息啊。考虑一下线段树维护啥,其实就是l,r这一段区间里面被矩形覆盖的线段的长度,扫到一个线,去看一看他是入边还是出边,入就这一段全是1,出就去除。之后我原创 2021-11-15 21:37:07 · 277 阅读 · 0 评论 -
状态压缩DP
简介状态压缩dp可以说是耳熟能详了吧,其实就是但我们类似于用搜索的思想找情况,之后对于每一个情况就可以当作一个状态去转移,在学习这个之前让我们先去学习一下位运算位运算“|” or 或运算 , 两个有一个是1就是1“&” and 与运算 , 两个都是1才是1“^” 异或运算 , 两个不同才是1例题P1896 [SCOI2005]互不侵犯oi wiki上的例题,也是我第一个状压的题目首先我们发现这个题目是一个类似于在棋盘上的计数,之后我们先不想状态压缩,直接dp的话如何dp[i原创 2021-11-06 20:36:21 · 124 阅读 · 0 评论 -
fhq——treap
前言这是分裂平衡树,是范浩强神牛发明的,我觉得是一个好写,好调的平衡树,所以先%fhq 之后开始原理其实就是把普通的treap的旋转换成了分裂,于是他就可以实现所有平衡树的所有操作结构体里的东东1.val值2.key 索引3.l,r左右孩子编号4.size大小split这是很重要的操作之一,这个是按照val把这棵树分成两个,一个全都小于等于val,一个全都大于val,代码如下inline void split(int now,int val,int &x,int &y原创 2021-10-30 14:55:01 · 309 阅读 · 0 评论 -
简单数论合集
数论gcd这个就很简答了,直接看代码int gcd(int x,int y){return !y?x:gcd(y,x%y);}gcd也有一点点的性质主要还是 结合律 比较有用还有就是这个算法的复杂度合适最大呢,其实就是去求 斐波那契数列 的相邻两项的gcd,这也是一个比较神奇的性质太简单了,所以来一个难一点的exgcd这个可以干啥呢求 ax+by=n.之后就是代码void exgcd(int a,int b,int &x,int &y){ if(!b)原创 2021-09-17 20:50:03 · 165 阅读 · 0 评论 -
树型问题合集
树型问题lca见我的的另外一个dfs序我们知道两个点x,y如何快速的判断y是不是在x的子树内先上代码void dfs(int x){ l[x]=++cnt;//这个点何时进入dfs、 for(int i=head[x];i;i=nex[i]){ dfs(to[i]); } r[x]=cnt;//这个点何时出dfs}这里我们就可以得出,假设z是x一个子树,则l[x]<=l[z]<=r[z]<=r[x]如果要判断是不是子树内,只用判断dfs序就好了...原创 2021-08-22 12:00:59 · 124 阅读 · 0 评论 -
最短路合集
最短路合集前言这里面有最短路的好多好多应用,不要错过啊dij板子看这里拓展分层图看这里最小路径树这个不是最小生成树,这个要求的是我们在图上找的这棵树的每一个点到源点的距离都是原原来的最小路的长度,并且这个树的边权和要最小这个可以用找前驱的方法去处理,也就是我们每一次松弛的时候都去记录是哪个边松弛了这个点,最后用dfs去找这棵树。注意这里有一个细节就是在松弛的时候if( dis[to[i]]>=dis[g]+val[i]) 这里加上“=”其实就是省略了一次判断,就是看这个图里面原创 2021-08-21 16:32:32 · 89 阅读 · 0 评论 -
分层图
分层图定义和应用其实就是对于一些题,他边的权值可以改变,并且每一条边改变的次数不多,这种我们可以用分层图去跑最短路至于定义,就是有k+1层,每层之间可以连边,每个层里面的点的边权是不变的,之后层和层之间是这样的,假如原来a,b,之间有边,那么下一层a2,b2之间也有边,并且a,b2之间有边,b,a2之间有边,至于这里层之间的边权就看题目是如何要求的,假如说这个是去修建高速,那么层之间肯定是只可以从上层到下层,毕竟你不可以说这条路在拆了。正确性其实这个和暴力有一点相似,我们的dij是会把每一个点都跑原创 2021-08-20 20:26:24 · 133 阅读 · 0 评论 -
spfa已死???(bushi)
spfa之前说这个spfa已经死了,但是今天看到一道题去维护变量之间额大小关系,第一想法是并查集,但是好像并查集并不可以维护查分约束的条件,所以我看了看题解,发现是我认为已经死了的spfa(思想还是松弛,还是松弛,还是松弛,其实就是一个优化的bellman ford,本质上就是bfs去找点,只要dis大就去松弛,之后看看这个点在不在队列里,如果不在就加入队列,之后一波操作完成之后就可以的到单元最短路,其实还是很easy的上代码void spfa(int x){ dis[x]=0; vis[x原创 2021-08-20 00:06:32 · 1716 阅读 · 0 评论 -
树链剖分
树链剖分前言哎,noi2021结束之后才开始学这个,d1t1的算法,我真是了,而且改了一下午就是一个快读写错了,mmd原理剖分,就是把一棵树给分成不同的链子,之后在这些链子上去进行操作,至于剖分的种类长链剖分(不常用)重链剖分(就是今天要去学习的)实链剖分(lct)那么什么是树剖的原理,其实就是对每一个点去找重儿子,之后再去剖分成一个个的链,每一次我dfs排序的时候先递归重儿子,最后用线段树去维护区间和之类的。先介绍一下每一个变量含义变量含义1.重儿子;就是一个节点的儿子中节点数最多的原创 2021-08-19 18:41:20 · 103 阅读 · 0 评论 -
网络流初步
网络流初步这个知识最简单的网络流算法,至于最小割定理等等,等这篇的名字变为网络流算法的时候就补上了原理其实dini的算法的思想很简单,就是去找增广路,何为增广路,也就是原点到汇点的每一条边的边权都为非负的路,这个,而这个算法的核心就是通过反向边的加上来去增广,何为增广就是找增广路,并找到这一条路上的残余流量最小值d,给这条路的每一条边的流量加上的d,给反向边的容量也加上d,给ans也加上d,最后但找不到增广路的是时候,ans就是最大值代码实现其实dini的算法写起来很好写(我觉得图论算法都不难,不原创 2021-08-16 21:08:29 · 80 阅读 · 0 评论 -
树上差分例题
树上差分P3128这是我学完lca之后找的一道题,之后发现和lca有个毛线关系,差点下手就是五十行的lct,最后看了看题解就了解了树上差分的思想思想我们每一次对于两个点a,b的操作就是把a->lca(a,b)和lca(a,b)->b上的点加上1,我可以用差分的思想。大家想一下对于一个数列,我把(l,r)的每一个数加上1,是不是就是先把r+1,之后把(l-1)-1,最后求前缀和,就可以求出这个修改过的区间的和,那么树上是不是也是一样的,先把sum[a]++,sum[b]++,之后要想一下原创 2021-08-16 16:11:39 · 164 阅读 · 0 评论 -
树上找爸爸
倍增求lca原理我们定义fa[i][j] 是i向上走2^j 步的父亲,那么我们是不是可以通过dfs去预处理这个fa数组,具体就是fa[i][0] 肯定就是这个点的直系爸爸,我们在循环中每一次先向上跳 2^log(j-1) 在向上去跳一样的步子就可以求出fa[i][j]是谁了。之后如何去找lca呢,我们采用倒叙去找爸爸的方法,如图假如找6和4的lca,我们先将他们跳到同深度,之后先去找fa[4][log[deep]==fa[6][log[deep]]? 如果相同那么这个点一定在lca的上面,我们不原创 2021-08-16 15:09:39 · 122 阅读 · 0 评论 -
主席树
可持久化线段树原理什么是可持久化线段树呢,为我们知道对于一个区间[l,r]我们可以用线段树去维护这个区间最值,并且可以用权值线段树去维护区间[1,r]的第k大,but对于任意区间的第k大该如何去求呢,其实思想也很简单,我们只要开n个权值线段树,之后利用前缀和的思想就可以求出来了,但是开n个线段树这个空间复杂度实在太大,所以我们hjt大佬就开发出了主席树。图解例如,一列数,n为6,数分别为1 3 2 3 6 1首先,每棵树都是这样的:以第4棵线段树为例,1~4的数分别为1 3 2 3因为是同原创 2021-08-15 11:43:31 · 90 阅读 · 0 评论 -
线段树
学习笔记四线段树数据结构在noi比赛中的重要性不言而喻,我们已经学了两个十分简洁有神奇的数据结构,现在我来看一个又长又好用的线段树。首先我们要知道线段树可以干啥,区间之间的操作,单点查询,区间查询,区间修改什么的,记住有了线段树以后就不要在用O(n)的暴力搜索了。建树。。。。线段树的本质是一个二叉树,我们用递归的方法来建树,用回溯的方法来确定定值,只要到叶子结点赋值并且返回。代码如下:void build(int l,int r,int o){ if(l==r) { tree[o]=a[l原创 2021-08-03 23:20:22 · 78 阅读 · 0 评论 -
配对堆
配对堆在stl里的priority——queue是一个很好用的堆,但是假如说我们要将两个堆去进行合并的话,普通的堆的时间和空间复杂度都大大超标,这时候我们就有了可合并堆,我个人认为配对堆会好些一点,所以就放弃左偏堆了(基本原理我们知道一个多叉树的存树方式 是父亲指向儿子,我们的配对堆其实也是一个多叉树,但是它的存树方式是儿子左兄弟,也就是我们用一个结构体去存堆struct heap{ int r;//right int s;//son int x;//value};int fa[100];原创 2021-08-14 12:57:47 · 180 阅读 · 0 评论 -
矩阵快速幂
矩阵快速幂快速幂再讲矩阵之前想要来做一下铺垫,什么是快速幂,我们知道2的n次方要用o(n)的时间求解,太慢了,我们可以每一次让次数除以二,底数平方,每一次当指数为奇数的时候,就把ans=ans*base,这样就可以用o(logn )的时间求出一个指数的值矩阵下面这张图来告诉你什么是矩阵,和矩阵乘法的定义...原创 2021-08-13 17:03:24 · 94 阅读 · 0 评论 -
背包问题
背包问题这一个是背包问题的全集,所以还会持续更新01背包背包中最经典的一个问题,有n个物品,每一个有价值v和权重w,一个包包容量为x,问取得最大价值为多少?二维的状态很好设计dp[i][j[表示拿第i个物品,用了j空间的最大值,那么转移方程也就可以得出dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])也就是这个物品不拿所得的价值和拿上这一个物品所获得的价值的最大值,正确性显然。但其实空间复杂度还可以优化,我们发现这是一个之和上一个i有关的转移,所以可以用动原创 2021-08-12 20:26:22 · 76 阅读 · 0 评论 -
组合数学芝士加题
组合数学这是一个和高考接轨的东东,先复习一下加法和乘法原理,加法原理:就是一个点有三条路可以到达,那么现在有多了2条路,一共是不是2+3=5条路。乘法原理:三个点,第一个点有3条路到第二个点,第二个点有2条路到第三个点,一共第一个点到第三个点有6条路。排列数下一个就是排列数,这个主要是对顺序没要求的时候也用在这里插入图片描述组合数组合数,这个是ab,ba看成一种的时候用的例题助于理解,之后入堆,我们每次拿出堆顶的的一个去松弛她所连接的点,之后知道所有都完成为止,其实不难,注意这个不可以去求有负环的最短路,如果有就还是用已经死掉(bushi)的SPFA最后模板来一手int di原创 2021-08-10 14:55:41 · 108 阅读 · 0 评论 -
DAG图的性质
1.DAG上必然存在出度为0的结点。2.DAG上若存在唯一出度为0的结点,则该结点可被DAG上其他所有结点到达。3.问在DAG上最少选择多少个点能够使得从这些点出发可以到达所有点,那么答案就是入度为0的点的个数。4.假设DAG上出度为0的结点有a个,入度为0的结点有b个,那么在加max(a,b)条边可以使得该有向图强连通。加边的方法:要为每个入度为0的点添加入边,为每个出度为0的点添加出边假定有 n 个入度为0的点,m个出度为0的点,如何加边?把所有入度为0的点编号 0,1,2,3,4 ….N原创 2021-08-09 16:28:01 · 775 阅读 · 0 评论 -
Tarjan
强连通分量那些事tarjan先定义一下强连通分量,就是在一个图中的一个子集,子集中的每一个点都可以相互到达,并且再加入一个点都不满足这个性质,我们称它二这个图的极大强连通子集,也叫强连通分量。我们发现,其实一个不在环内的单点,or一个环就可以构成强连通分量,那么我们怎么去求呢,一个叫tarjan的牛人给出了答案,也就是dfs生成树的方式。首先我们定义low数组是这个点可以到达的点中dfs顺序最小的点,dfn就是dfs的顺序,之后我们每一次dfs的时候都把找到的点放入一个栈s中,最后当low[x]==原创 2021-08-09 15:27:41 · 107 阅读 · 0 评论 -
floyd
Floyd多元最短路径注意这个一定是松弛点在最外层循环(上面这条如果记不住其实跑三次floyd就一定可以得出正解,但毕竟会被卡常)这是一个耳熟能详的算法,对于每一个oier来讲应该都写过,主要的思想就是通过不断地枚举顶点去进行松弛操作,其实对于单纯的多元最短路,我们可以打dijk加枚举,或者直接bfs加枚举,复杂度都比他小,但是这个算法的作用其实是哟个思想,我们可以利用这个松弛操作的思想来干很多事,比如维护图的连通性,就有点像并查集。这里来一道维护图的关系的例题,https://www.luogu原创 2021-08-06 21:05:47 · 115 阅读 · 0 评论 -
字典树
字典树,map字典树其实和哈夫曼编码有异曲同工之妙,我们下一次就来说说哈夫曼编码的经典应用《荷马史诗》(noi大水题)。什么是字典树,就像名字一样可以实现字典的功能,我们可以把一个个字符串像这样存入这样看起来是不是就清晰了。这个字典树主要有插入和查询这几个操作,我们呢先来看插入insert不难发现插入我们要从root开始找,定义一个tree[i][j]数组里面是第i号节点的第j个儿子,j就是我们把字符转化为的数字,如果为0 就说明没这个孩子那么我们就加上这个,如果有就再往下找就欧克了,最后在叶子节原创 2021-08-05 17:31:44 · 74 阅读 · 0 评论 -
优先队列
学习笔记Priority_queue<>优先队列怎么说,在2021noi被dalao虐完 之后,决定要发奋图强,2022华二的noi不能丢脸,这也算是复习笔记的第一篇,stl神奇————优先队列现总结常用的函数Priority_queueq;//定义一个q的堆 默认是大根堆Priority_queue<int,vector,greater >q//定义一个小根堆如果你想带上什么数组编号,深度等等,可以带上pair函数Priority_queue<pair(int原创 2021-08-03 23:16:20 · 120 阅读 · 0 评论 -
St表。
学习笔记二St表众嗦粥汁,当提到区间维护时我们想到的绝对是线段树,树状数组,st表,其中线段树是绝对的万金油,但是对于区间最值的查询还是st表的神乎其神的O(1)最为膜拜,现在让我们开始吧。St表有一点dp的意思,我们定义一个数组mn[i][j],它里面存的是从j到j+2^i-1 的最值(这里以最大值为例),那么显然mn[i][j]的最值为前半段的最值和后半段的最值的max,mn[i][j]的长度是2^i, 所以一半的长度是2^(i-1), 那么我们就可以得到转移方程mn[i][j]=max(mn[原创 2021-08-03 23:17:50 · 104 阅读 · 0 评论 -
树状数组
学习笔记三树状数组上一次我们学习了复杂度十分之低的st表,这一次来学习一个更加神乎其神的树状数组,虽然他的全部功能线段树都可以包含,但是它体现的编程的简洁的魅力我们先有一个lowbit函数,他其实很简单只用return一个x&(-x),因为noi是一个功能性比赛,所以我们并不需要内容哈哈哈。之后就是单点修改(也是初始赋值)Int update(int x,int y){//给x加上y For(int i=x;i<=n;i+=lowbit(x)){ Tree[i]+=y;}原创 2021-08-03 23:19:01 · 82 阅读 · 0 评论