![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
acm算法学习
魔法自动机
硕士在读,主要做医疗软件开发和医学图像处理。
展开
-
acm专题学习之线段树(四)应用:求区间最大连续和
问题:求某个区间的最大连续和,例如序列4 -3 6 1 7 8,询问区间[2,5]中的最大连续和,也就是[-3 6 1]的最大连续和,肯定是7。(如果序列只有正数的话是不同考虑这么麻烦的,这里主要针对的是有正数也有负数)思路:对于这个问题,很容易想到n^2的暴力,再优化点也就是求前缀和找区间最大值和最小值,用最大值减去最小值就是答案(其中的最大最小值指的是前缀和,最大值的前缀和下标必须大于最小...原创 2019-07-30 19:48:47 · 373 阅读 · 0 评论 -
acm专题学习之字符串(三)AC自动机+HDU - 2222
AC自动机:与kmp的区别:AC自动机是多模式串匹配,kmp是单模式串匹配思想:字典树和kmp的结合,还是和字典树一样建树,但是要加入个fail指针来实现和kmp的next类似的回溯功能。fail指针的回溯:对下图的解释,每个结点都有编号(图中原点里面的就是编号),fail指针的指向(图中的虚线)。搞懂fail指针是指向的是什么,fail指针指向的是父节点相同的同值节点(根节点视为与任...原创 2019-03-31 17:18:23 · 231 阅读 · 0 评论 -
acm专题学习之字符串(二)字典树+Gym - 102020D
字典树(Trie树)使用情况:用在找出某单词是多少个单词的前缀理解思想:利用字符串的公共前缀来减少查询时间树图:单词ac ak day dad fall fine 构成的字典树模板题Gym - 102020D题目意思:给你一些单词,然后每个字母对应着手机上九宫格打字的数字,给你一些数字串,问你数字串是多少个单词对应数字串的前缀。字典树思路:把单词转化为数字,就是一道裸...原创 2019-03-31 01:01:13 · 266 阅读 · 0 评论 -
acm专题学习之网络流(一)最大流+CSU2073: Tile Cut
网络流最大流问题网络流最大流问题:给定有向图,有两个特殊的源点s和汇点t,每条边有一定的容量,问满足从s到t的最大流量一些词汇的理解:流量flow,是指每条边实际流过的量 容量capacity,是指每条边可以通过的最大流量 残量residual,是指每条边的上的容量和流量之差最大流基本算法——增广路算法增广:从源点到汇点的某一条路,每条边的残量取最小值d,这个最小值就是这条路...原创 2019-03-30 23:51:01 · 395 阅读 · 0 评论 -
acm专题学习之字符串(一)kmp算法+kmp的next理解+CodeForces - 126B
kmp的next:1 next数组含义:除去第i个数,在一个字符串里面从第一个到第(i-1)字符串的前缀与后缀最长重复的个数。2 理解一下代码过程:(abacbaba为例)”“,i==1,前面没有字符,没有前后缀,next为0“a”,i==2,只有一个字母,没有前后缀,next为0(第1个数)“ab”,i==3,前缀为“a”,后缀为“b”,前后缀相同长度为0,next为0(第2...原创 2019-03-31 01:00:23 · 177 阅读 · 0 评论 -
HYSBZ - 2330 补题——约束差分
约束差分1 概念:如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统。2 转化成图后使用最短路:给3个数a,b,c,还有3个约束条件:a−b<=v1,b−c<=v2,a−c<=v3这个时候a−c<=min(v3,(v1+v2))相当于,给你一个图,a,b,c为顶点...原创 2019-03-09 10:24:20 · 175 阅读 · 0 评论 -
acm专题学习之博弈(二)SG(Sprague-Grundy)+Gym - 101954H Split Game
基础知识:1公平组合博弈(ImpartialCombinatoriGames)(ICG)两人参与 游戏局面状态集有限 两个玩家轮流操作 面对同一个局面,两个玩家可操作的集合完全相同(象棋就不是,因为每个人只能移动自己的棋子) 当没有操作可操作时,游戏结束 不管双方如何操作,游戏总能再有限操作数后结束2 把ICG局势间的关系抽象成一个有向无环图任何一个ICG都可以通过把...原创 2019-02-19 23:27:13 · 304 阅读 · 0 评论 -
acm专题学习之最短路(三)SPFA算法+UVa558_Wormholes
基础:Bellman-Ford算法:是求含负权图的单源最短路径的一种算法,也可以用来判断是否具有负权环。Bellman-Ford实现思路:和dij有点类似,使用dis[ ]数组(更新记录每个点到起点s所需要的最短路),per[ ]数组(用来记录最短路每个点的父结点)。进行n-1(点的个数-1)次的松弛操作(对dis[ i ]进行修改),如果n-1次松弛过后,还能够再进行松弛,就说明含有负权...原创 2019-02-19 11:41:21 · 169 阅读 · 0 评论 -
acm专题学习之博弈(一)常见的博弈
一、巴什博弈(Bash Game)情形:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。当n = m + 1,我们假设第一个人拿走了k个, 还剩下 m + 1 - k。 因为1<=(m + 1 - k)<= m, 所以, 剩下的部分一定可以被第二个人一次性取走。会发现:当n=(m+1)* r+s(r∈ N,s<= m),...原创 2019-02-13 12:23:44 · 363 阅读 · 0 评论 -
acm专题学习之动态规划(二)LIS最长上升子序列
最长上升子序列:一个序列,求出一段不断严格上升的部分,不一定要连续。(区别于子串:要求连续)求最长上升子序列有两种方法,一个是复杂度n*n,一个是复杂度n*log2n。复杂度n*n的算法:dp[i]对应为前i个的最长上升子序列。 for(int i=1;i<=字符串的长度;i++) { dp[i]=1;//前i个字符的最长上升子序列最少为1,就...原创 2019-03-23 10:30:21 · 256 阅读 · 0 评论 -
acm专题学习之最短路(二)Floyd算法+UVa567_Risk
题目:有20个城市,只能征服相邻的城市,让求任意给定两个城市的最短路Floyd算法:(多源最短路径)用于求任意两个点之间的最短路径算法的思路:枚举每两个点,枚举中间必须经过中转点,取最小值(动态规划算法dis(i,j) =min(dis(i,k) + dis(k,j),dis(i,j)))与Dijkstra区别:1Dijkstra是单源点,Floyd是多源点 2Dijkstra不存...原创 2019-02-16 22:59:47 · 165 阅读 · 0 评论 -
acm专题学习之数学(三)高斯消元+Gym - 100008E
题意:给你矩阵大小n×m,让你求出一个0/1矩阵,它的上下左右加上自己1的个数为偶数,且矩阵尽量不为全0。是多case。条件:上下左右加上自己1的个数为偶数 矩阵尽量不为全0思路:会发现只要知道了第一行的排列那么就可以推出剩下所有行,这个时候很容易想到之前学的翻转问题,利用第一行状压枚举,但是会发现m的范围40,2^40暴力是不可能的。这时候会发现既然能够推出下一行,且n+1行全为0,...原创 2019-07-24 22:58:25 · 323 阅读 · 0 评论 -
acm专题学习之STL(一)random_shuffle+CodeForces - 330E
题意:给你一个图,图满足每个点最多连两个边,不存在自环,两点之间不存在多个边。让后然你重新组合触一个新图,新图满足旧图的条件,但是不能存在旧图所拥有的边。问你新图是否存在?存在输出边,不存在输出-1。条件:每个点最多连两个边,不存在自环,两点之间不存在多个边 新图不能存在旧图所拥有的边思路:因为他说了最多连两条边,那么我们把所有的点都连成环,如下图。然后随机环上的点,如果换上组成边和旧...原创 2019-07-18 10:05:30 · 258 阅读 · 0 评论 -
acm专题学习之博弈(三)实战+URAL - 2104
题意:Alice和Bob在玩一个游戏,这个游戏有个纸条,纸条的两面有相同长度且由AB组成的字符串。每次其中一个人可以对折一次纸条,直到不能再对折为止。如果最后纸条表面全是A则Alice获胜,如果全是B则Bob获胜,如果都不是则平局输出Draw。Alice为先手。思路:dfs搜索,但是这里也用到了博弈的知识。对折每次只有偶数才能对折,那么结束条件就是纸条长度为奇数的时候。这种两面对折,可以不用分...原创 2019-07-11 11:14:23 · 170 阅读 · 0 评论 -
acm专题学习之数学(一)分解质因数+URAL - 2102
题目:数字N(1e18),其分解后(N=a1^p1*a2^p2...),问幂的和(p1+p2+p3...)是否为20。思路:暴力+优化:通过观察1e6*1e6*2^18>2e18,会发现最多只有一个大于1e6的因子,那么可以只求1e6范围内的质因子,然后如果过了1e6后和的数量还为19,那么只需要判断除后剩下的是不是质数。 分解质因子+优化:套用分解质因子模板,在后面不可能再有20...原创 2019-07-11 00:15:57 · 784 阅读 · 0 评论 -
acm专题学习之数学(二)康托展开+CodeChef - STFM
题意:给你一个公式F(x) = 1 × (1! + x) + 2 × (2! + x) + · · · + x × (x! + x),n个pi,计算F(p1) + F(p2) + · · · + F(pn),然后结果模m。康拓展开:X=a[n]∗(n−1)!+a[n−1]∗(n−2)!+...+a[i]∗(i−1)!+...+a[1]∗0!含义:设有n个数(1,2,3,4,…,n),可以有...原创 2019-07-14 11:27:44 · 195 阅读 · 0 评论 -
CF练习——Codeforces 1172B(组合数学)
题意:Nauuo有n个不同的点(从1到n),然后她想让n个点排列在圆上,并且满足这些点的连接关系满足一颗她给的树,点和点之间的连线不能够交叉。n个点排列在圆上顺时针的序列有多少种不同。条件:n个不同点排列在圆上 n个点之间的连接关系构成一个树 点之间连接的线不能够相交 n个点排列在圆上顺时针的序列有多少种不同样例来方便理解一下:思路:可以从样例出发,如果没有题目的限制...原创 2019-07-08 12:07:40 · 329 阅读 · 0 评论 -
acm专题学习之数据结构(一)划分树+POJ 2104
划分树:1 功能:查询区间第k大2 复杂度:logn3 思路:主要是两步,一个是建树,一个是查询。4 建树:找到序列的中位数,把大于中位数的扔到中位数的左边,小于中位数的扔到数的右边。这样就被分成了两个字区间,然后在子区间再重复相同的步骤,直到没有数字。(递归的过程)使用分层的二维数组tree[20][maxn](一般十万级别的数字20层足够)。建树前需要重新排一次序,因为划分...原创 2019-05-03 12:18:54 · 281 阅读 · 0 评论 -
acm专题学习之单调栈(一)单调栈入门+Max answer
单调栈:定义:栈里面保持一种单调性举例:栈里面的元素为1,2,5,6(6是栈顶) 插入一个元素7 7大于栈顶元素6,可以直接入栈,此时栈为1,2,5,6,7 插入一个元素4 4小于栈顶元素7,7出栈,栈为1,2,5,6 4小于栈顶元素6,6出栈,栈为1,2,5 4小于栈顶元素5,5出栈,栈为1,2 4大于栈顶元素2,可以直接入栈,此时栈为1,2,4遇到比栈顶元素大的就直...原创 2019-04-23 23:06:46 · 382 阅读 · 0 评论 -
acm专题学习之二分图(一)二分图判定(染色)
二分图:二分图是什么:顶点集可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。(边不能连接同一个子集的点)图示:二分图染色:情况:给一个图,没有自环,没有同一条边连着多个点有两种颜色给你染,相连的两个点不能染成不同颜色用途:可以用来判断是不是二分图对于连通图思路:bfs遍历,第一个点取一种颜色,遍历的时候看看会...原创 2019-04-03 21:42:52 · 762 阅读 · 0 评论 -
acm专题学习之最短路(四)次短路+LightOJ - 1099
次短路定义:找出第二短的路径长,次于最短路。思路:求两次最短路,一个是到起点的最短路,一个是到终点的最短路。然后遍历每一条边,每一条边的两个点分别到终点和起点的最短路的和+边的长度,如果这个和大于最短路,就让ans取这些路中的最小值就好了。LightOJ - 1099题意:给你n个点,m条边,让你求出次短路(次短路的长度要小于最短路,相同的不算)思路:次短路的思路。代码:...原创 2019-04-07 10:50:27 · 266 阅读 · 0 评论 -
acm专题学习之最短路(一)Dijkstra算法+poj-2387
题意:有n个点,给你 t 条带权路,求出从1到n点的最短路条件:t 条带权路(有路可能会重复)Dijkstra算法:(Dijkstra算法只能应用于不含负权值的图) 算法思路:用一个数组dis记录下所有点到起点的最短距离,最后取dis[终点]。进行n-1次查找,每次找到没有被拜访过离起点最小距离的点,再刷新dis数组。 ...原创 2019-02-10 12:14:22 · 298 阅读 · 0 评论 -
acm专题学习之生成树(二)次小生成树+HDU-4081
题目:秦始皇想要修路,他只想着修总长度最小(最小生成树)。但有个道士告诉他,可以用魔法修一条路,不耗费人力财力的一条魔法路。秦始皇想要使非魔法道路总长度尽可能小,道士希望尽可能多的人受益。最终决定:修魔法路的两个城市,(两个城市的总人口)/(非魔法道路总长度)必须是最大。输入:t个测试数据,n个城市,每个城市输入为坐标(x,y)和人口p输出:(两个城市的总人口)/(非魔法道路总长度)最大值...原创 2019-02-16 12:18:15 · 278 阅读 · 0 评论 -
POJ 3264 Balanced Lineup-初入算法 线段树
题目:一个农场主有n头牛,每头牛都有一个高度,农场主给q次询问,希望求出询问给的区间中最大最小值的差 条件:1,求区间最大最小值的差输入:n(1<=n<=50000) q(1<=q<=200000) n行牛的高度(1<=高度<=1000000) q次询问的区间输出:每次询问后最大最小值的...原创 2018-03-20 15:07:45 · 159 阅读 · 0 评论 -
H - Happy Sequence ZOJ - 4011 补题
题目:给你1-n个数,组成一个长度为m的序列,每个数是前一个数的倍数,问这样的序列有多少种,可以重复使用数字。输入:t(1<=t<=50) n,m(1<=n,m<=2000)输出:种数(结果取10的9次方+7的模)思路:第一位有n种选择,第二为有上一位每种数字的自身+数字对应的倍数的数字,以此类推,第一反应是递归,但是递归容易超时,想办法转化...原创 2018-04-23 22:02:34 · 168 阅读 · 0 评论 -
G - Traffic Light ZOJ - 4020 补题--bfs
题目:给一个n×m的图里,每一个格子里有一个灯,灯有两种状态,每种状态对应着向左右走或者是上下走。但是每过一秒钟这个格子对应的灯就会变成另一种状态的灯,每一秒只能走一格,问从某一格到另一格最少的步数。条件:1,每个格子中的1对应只能左右走,0对应的是只能上下走 2,人每一秒只能走一格,每秒所有的格子里的状态都会变成相反的输入:n,m图的大小(1<=n*m<...原创 2018-04-18 19:12:24 · 277 阅读 · 0 评论 -
ZOJ 4019F - Schrödinger's Knapsack --补题 dp
题目:给两个序列,两个序列的系数分别为k1,k2,有一个背包容量为c,从两个序列里面取数(这个数相当于放入物品的体积)放入到背包中,使得背包里面装的价值最大条件:1,每次放进背包里面的价值=背包剩余的体积*放入物品对应序列的系数输入:输入t组数据 k1,k2,c(1<=k1,k2,c<=10的7次方) 输入两个序列的长度n,m(1&l...原创 2018-04-18 18:50:59 · 241 阅读 · 0 评论 -
FZU 2254 英语考试-初入算法 最小生成树
题目:Yellowstar要参加英语考试,要记很多的单词,要求用尽量少的时间记单词 条件:1,凭空记下一个单词要m个精力 2,如果他之前已经记过一些单词,可以通过联想来记忆,即是两个单词的汉明距离(就是不相同的字母数)*w输入:很多组 n个单词 m长度 w (1<=n<=1000,1<=m w<=10) n个单词输出...原创 2018-03-23 18:08:45 · 120 阅读 · 0 评论 -
ZOJ Problem Set - 4016 Mergeable Stack--补题 list
题目:给n个栈,给三种操作条件:1,操作1的时候,将值放到栈的顶部 2,操作2的时候,弹出栈顶的元素,如果栈为空,就输出EMPTY 3,操作3的时候,把b栈接到a栈的后面思路:用list或者链表,list最方便代码:#include <cstring>#include <cstdio>#include <...原创 2018-05-03 23:51:43 · 128 阅读 · 0 评论 -
走迷宫--bfs
题意:走迷宫,但是加入了传送门,传送门分为入口和出口输入:多case 迷宫大小n,m 输入无空格间隔n行01串(0代表可以走,1代表是墙) 输入q q行传送门的入口和出口的坐标 终点和起点的坐标思路:bfs,传送门无非就是换个地方继续bfs代码: #includ...原创 2018-05-23 23:48:06 · 1015 阅读 · 0 评论 -
HDU 2817 A sequence of numbers--快速幂
题意:给出数列前三项,不是等差就是等比数列,然后给出一个k值让我们求出第k项条件:1 等比或者等差 2 求第k项思路:先判断是等比还是等差,然后求第k项,数学问题,但是求等比数列的时候容易超时,所以求等比数列第k项的时候要记得优化。但是做题的时候,我没有学过快速幂所以自己优化过了,现在来学习一下快速幂。代码:#include <iostream>...原创 2018-07-10 09:55:20 · 128 阅读 · 0 评论 -
51nod 1091线段的重叠--贪心
题意:x轴上有很多条线段,两个线段相交例如10 20和12 25相交,那么相交的长度就是20-12=8.有n条线段,选出两条重叠长度最长的。条件:1重叠部分是两条线,最大的左端点和最小的右端点差值思路:开始想复杂了,想到了扫描线,然后还用了set去解。其实贪心就可以了,以起点升序,终点降序排列,贪心取最大值。代码:1我最开始的想法,过的,我觉得也有一定的参考价值:#inclu...原创 2018-07-10 10:24:56 · 135 阅读 · 0 评论 -
CodeForces - 437 C. The Child and Toy--补题
题意:n个点的连通图,每个点有一个权值。要你把所有的点分开,分开一个点需要消耗与它相邻点的权值之和那多的能量。条件:1 分开一个点需要消耗与它相邻点的权值之和那多的能量思路:描述很复杂,往往越复杂的东西,越简单(我的高中数学老师说的)。图都是由点构成的,那就去讨论目标点。我们要删除的目标点与周围的点的关系有三种:目标点的权值比周围点都小,那么肯定是让周围的点先删除;目标点的权值比周围的点都...原创 2018-07-12 23:51:52 · 149 阅读 · 0 评论 -
CodeForces - 455C Civilization--补题 dfs+并查集
题意:给你n个城市,然后告诉你m条路,然后q个询问。第一个询问是让你输出该城市所在的区域的最长路。第二询问是让你把两个城市所在区域,并使得合并后的区域最长路最短。条件:1 第二询问是要使得合并后的区域最长路最短 2 区域就是与该城市相连所有的城市构成的集合思路:这题最难的地方在于求最开始最长路和使得合并后的区域最长路最短。求最开始的最长路可以采用两次dfs,dfs...原创 2018-07-17 23:49:50 · 139 阅读 · 0 评论 -
HDU - 3006 The Number of set--补题 状态压缩 hash
题意:给你n个集合,每个数字不超过14,问这几个集合可以合并成多少种集合(不合并也算)条件:1 合并集合,不能改变原来集合思路:hash得思想就是映射,这里让每一种集合得方式都映射成一个二进制数,例如集合(1 2 5)映射10101。状态压缩其实就是灵活得运用位运算,这里会发现两个集合所对应得二进制数或式得到结果就是两个集合得合并,例如集合(1 2 5)映射10101和集合(1 2 7)映...原创 2018-07-20 23:14:40 · 108 阅读 · 0 评论 -
HDU 6298 Maximum Multiple--多校补题 数学题
题意:给一个数字n,让你求xyz最大值,其中xyz满足 n=x+y+z, x∣n, y∣n, z∣n条件:1 n=x+y+z, x∣n, y∣n, z∣n 2 其中x,y,z,n都是整数思路:n=x+y+z -->> n=n/a+n/b+n/c -->> 1=1/a+1/b+1/c。其中1=1/3+1/3+1/3是最好想的,增大其...原创 2018-07-24 11:07:23 · 189 阅读 · 0 评论 -
hdu6301--Distinct Values--多校补题 贪心+set维护
题意:让你求一个长度为n的数列,数列的条件满足给得m个区间里面数字两两不同,且字典序最小条件:1 满足给得m个区间里面数字两两不同,会互相重叠 2 字典序最小,在两两不同的必要区间中从1递增思路:贪心,m个区间里面数字两两不同,重叠出最大的区间。然后用set存取1-n个数字(set本身就会自己排序,每次取可以取数字最小的),维护每一个区间。代码:#inc...原创 2018-07-24 10:44:53 · 217 阅读 · 0 评论 -
Problem 2013 A short problem-初入算法 补题 简单的dp
题目:给出一个长度为n的数组,求不小于m长度的子数组里的和最大值 条件:1,长度不小m 2,求和的最大值输入:T组数据(T≤20) n(1≤n≤1000000) m(1≤m≤n).输出:输出每个满足题意的和思路:把长度为m的和的种类存在dp数组中,判断每个满足m长度的和加上后面的数与下一个满足m长度的和...原创 2018-03-20 12:51:39 · 133 阅读 · 0 评论 -
Problem 1989 AntiAC -初入算法 补题
题目:给一个只有大写字母的字符串。删除一些字母,使得结果字符串中没有“AC”。返回最长的结果字符串。如果有最长的 长度超过一个字符串,返回字典序最小的一个。 条件:1,没有AC 2,返回删除后最长的字符串,如果有多个解是一样长的就返回字典顺序输入:T 有T组数据T <= 100 接下来T行大写字符串(字符串长度不超过1...原创 2018-03-18 20:12:17 · 117 阅读 · 0 评论 -
B. Good Sequences -补题 dp
题目:给一个递增的数列,求出一个满足两个条件的好数列 条件:1,新数列递增 2,前后数有相同的因子输入:n (1 ≤ n ≤ 10的5次方) 长度为n的递增数列其中的数(1 ≤ a ≤ 105)输出:满足条件的好数列思路:把数列所有的因子都放在对应的数的一个数组里,直接开个二维数组,数组的a[i][0]用来存数,每行剩下的用来存因子。再用dp,如果一个因...原创 2018-03-14 17:48:22 · 327 阅读 · 0 评论