算法
文章平均质量分 52
算法学习
PBemmm
这个作者很懒,什么都没留下…
展开
-
差分(一维 / 二维)
原数组a[i],差分数组b[i] = a[i] - a[i-1],b数组是a数组的差分,a数组是b数组的前缀和。原创 2023-04-06 15:54:57 · 124 阅读 · 0 评论 -
数据结构补完计划(二) 权值线段树
权值线段树模板原创 2022-04-14 22:40:25 · 899 阅读 · 0 评论 -
数据结构补完计划(一) 线段树
线段树板子原创 2022-04-11 16:25:31 · 1015 阅读 · 0 评论 -
算法(九) 状压dp
思路对于状态多,决策较少(一般是两个)的问题,我们可以利用二进制去表示其状态,很多棋盘问题都会用到状压,一般求解会用到搜索P1879 [USACO06NOV]Corn Fields G思路首先值为1的地方可以种草,同时种草的地方满足上下左右无相邻\令f[i][j]表示第i行状态为j时的答案数那我们用init[]存放每一行的地图,若j为当前状态,要满足( j & init[] ) == j预处理同一行满足条件的状态 legal[i],其中(i & (i <&l原创 2022-05-12 17:29:54 · 150 阅读 · 1 评论 -
算法(八) 树形dp
树满足天然的递归结构,树形dp是一种非常优美的dp,主要实现形式是dfs,从根节点进行dfs,然后更新答案P1352没有上司的舞会(最大独立集)板子题。对于每个点,有选和不选两种方案,令f[x] [1]为选择该点时的最大值,f[x] [0]为不选时的最大值,显然 ans = max(f[root] [1],f[root] [0]),对于每个点 f[x] [1] += ∑ f[son] [0],f[x] [0] += ∑ max(f[son] [1],f[son] [0])这里注意,若x不原创 2022-05-11 18:50:29 · 148 阅读 · 0 评论 -
算法(七) 扫描线
扫描线思路(面积并)对于重合之后的图形,我们按边进行划分(如图),从下往上和从左往右扫都可以,对于划分出来的小块,我们可以(hi+1 - hi) * (线段覆盖的长度),下面的为入边,遇到+1,上面的为出边,遇到-1(先进入的线段会对后面的面积计算产生一定影响,到出去为止)思路大概就这样。。。(蛮简单其实具体实现首先x的坐标可能会很大,这里需要进行离散化对于矩形的边,我们只存端点这样转化成区间问题,使用线段树进行维护没了。。代码维护没了。。代码...原创 2022-05-11 15:56:55 · 187 阅读 · 0 评论 -
算法(六) ST表
ST表思想O(nlogn)的预处理,O(1)的查询倍增。令f[i] [j]为以i为左端点,长度为2 ^ j区间的最大值/最小值,则f[i] [j] = max(f[i] [j-1], f[i + (1 << (j-1) )] [j-1])。查询时,比如要查区间[L,R]的最大值,对应L + 2^j - 1 == R,所以j = log2(R - L + 1)但是区间长度并不一定正好满足R - L + 1 == 2的整数幂,那就左右端点都求,分为[L,L + 2^j - 1]和[R -原创 2022-05-10 12:05:04 · 101 阅读 · 0 评论 -
算法补完计划(五) 二分图匹配
二分图如果一张图能被分为两部分,两部分之间存在边相连,而单个部分内的结点无边相连,那这张图叫做二分图匈牙利算法之前博哥让我讲过的hh,练练题加深一下匈牙利算法除了二分图多重匹配之外,在二分图匹配中都能使用,还是比较常用的大致过程假如把图分成左右两部分,过程就是令依次遍历左边的结点,去连接右边的结点,如果发现所对应的点已经被之前的点所连,那么让之前的点挪一下(当然,不能挪就别挪了),去连接接下来的点,这是一个递归的过程,递归到能连上为止,如果不行,那说明这个点无法与右边的点匹配。百原创 2022-04-25 17:14:19 · 318 阅读 · 0 评论 -
算法补完计划(四) Tarjan算法
一些概念割点在无向图中,如果有一个结点x,当我们去掉x结点已经与其相连的边后,该图被分成若干个不相连子图(或者说这个图不联通了),那x即为割点桥又叫割边, 如果有一条边edge,我们去掉这条边后,图被分成两个不相连的子图,那这条边就叫做桥强连通分量有向图的极大强连通子图Tarjan求强连通分量经典tarjan = _ =,一直学的不大明白,加深一下印象dfn[x] / low[x]这俩变量是理解tarjan算法比较重要的东西dfn[x]是时间戳,这个时间戳的意思就原创 2022-04-24 01:24:46 · 253 阅读 · 0 评论 -
算法补完计划(三) 最短路
比较基础的图论算法,直接放板子了。。Floyd可爱的算法代码for(int k = 1;k <= n;k ++) for(int i = 1;i <= n;i ++) for(int j = 1;j <= n;j ++) dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);求最短路n<=500可以一试判断图的连通性(有向 and 无向皆可)稍微一改,dis[i][j] == 1说明联通原创 2022-04-22 19:52:02 · 225 阅读 · 0 评论 -
算法补完计划(二) 带权并查集
普通并查集先令每个fa[i] = i路径压缩操作int find(int x){ if(fa[x] == x)return x; return fa[x] = find(fa[x]);}find(a) != find(b)就合并两点,相等说明两点位于一个集合没了。。带权并查集普通的并查集只能判断两点是否在同一集合,适用范围比较小带权并查集同时维护每个结点到其祖先的距离 ,代码实现就是在路径压缩的时候,维护一个rank[]数组,递归到根结点后回来的时候不断rank[x]原创 2022-04-18 11:54:29 · 221 阅读 · 0 评论 -
算法补完计划(一) LCA
过程dfs先从根节点dfs,找到每个结点的深度和fa[i][0](f[i][j]表示结点i的第级祖先)原创 2022-04-17 21:54:55 · 256 阅读 · 0 评论 -
P2602 [ZJOI2010] 数字计数
题意:给定两个正整数 a 和 b,求在 [a,b] 中的所有整数中,每个数码(digit)各出现了多少次。数据范围:1 ≤ a ≤ b ≤ 题解:这道题的范围到,O(n)的做法铁超时,这里标答是数位DP或记搜数位1.预处理打表看一下,0-9出现的次数有规律,对于0-9 ,0 - 99,0 - 999这样的数据1-9个数是相等的(0特殊)我们令f[i]为最高位为i位时,1-9出现的次数,那么,如果不考虑前导0,0与其他数字的次数是相等的,这里观察发现,0的出现次数=原创 2022-03-15 23:17:25 · 458 阅读 · 0 评论 -
二分答案模板
这一波是搬运家:【模板+讲解】二分答案_Mashiro_ylb的博客-CSDN博客(没什么讲解)【洛谷日报#13】浅谈二分的边界问题 - 知乎(讲解版)原创 2021-10-31 16:35:58 · 133 阅读 · 0 评论 -
判断素数模板
概念:素数(质数),因数只有1和它自身的自然数(>=2,0和1不是素数)。1.朴素做法(略) 改进版:因为因子是成对存在的(8的因子2 4/4 2)2.原创 2021-10-24 12:39:08 · 155 阅读 · 2 评论