自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(214)
  • 收藏
  • 关注

原创 扩展kmp -- Theme Section HDU - 4763

Theme Section HDU - 4763题意:T次询问,每次给你一个字符串s(|s| <= 1e6),找到一个最长的子串,出现在s的串首、串中、串尾位置,互不重叠。输出这个子串的长度。思路:先用扩展kmp处理出s每位s[i]开头的的子串与前缀的最大长度,保存在nxt数组中,从尾部开始遍历nxt数组,如果i + nxt[i] = |s|(s的长度),则说明检索出了串首、串尾的两个子串,那再检索串中的子串是否存在,并在检索的过程中保证串首、串中、串尾的子串互不重叠。code:#incl

2020-12-14 23:58:54 230

原创 manacher -- 吉哥系列故事——完美队形II HDU - 4513

吉哥系列故事——完美队形II HDU - 4513题意:给你一系列数,求出最长的回文数列,且回文数列是从对称点往两端不递增。输出数列的最大长度。思路:manacher算法求最长回文数列,但要特判从对称点往两端不递增。code:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn =

2020-12-14 20:30:12 218

原创 manacher板子题 -- Palindrome POJ - 3974

Palindrome POJ - 3974题意:多行输入,每次给你一个字符串s(|s| <= 1e6),要你求出s中最长回文串的长度。思路:manacher板子。code:#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 1e6 + 5;char s[maxn], t[maxn * 2];int lengh[ma

2020-12-14 19:41:15 184

原创 manacher || 扩展kmp -- Best Reward HDU - 3613

Best Reward HDU - 3613题意:T次询问,每次给你一个字符串,字符串仅由26个小写字母组成,每个小写字母都有一个属性值。要你计算字符串的最大贡献。把字符串分成前后两个子串,若子串回文串则该子串贡献为字母的属性和,否则贡献为0。扩展kmp思路:用扩展kmp求出每个回文前缀和回文后缀并标记。在遍历划分子串求最大值。扩展kmp思路代码#include<iostream>#include<cstdio>#include<cstring>#in

2020-12-11 16:43:48 140

原创 kmp -- Count the string HDU - 3336

Count the string HDU - 3336题意:T次询问,每次给你一个数 n 和字符串 s ,n为s的长度。问你s的所有前缀要和s串匹配时要比较多少次。思路:next求出的就是和前缀匹配的最大长度,若长度大于0代表和前缀匹配,那么个数增加1,然后缩小前缀再进行判断。如 ababa 当我们匹配到a的时候,得到的next[5] = 3, 这时候次数增加1, 再匹配一下next[3] = 1,值也大于0那么次数还要增加, 再匹配next[1] = 0, 等于0了代表没有前缀和它相等

2020-11-27 17:01:00 82

原创 kmp 最小循环节

Cyclic Nacklace HDU - 3746题意:T次询问,每次询问给你一个字符串s(|s| <= 1e5 ),问你在串尾最少加几个字符可以使s至少包含两个循环节。思路:next数组求循环节,s的最小循环节长度 m = strlen(s) - nxt[strlen(s)]。显然,s中没有出现最小循环节,那最小循环节就是s串本身(nxt[strlen(s)] = 0),若有则可以把后面完整或部分的循环节通过减nxt[strlen(s)]去掉,保留第一个。code:

2020-11-26 11:50:00 213

原创 区间dp -- You Are the One HDU - 4283

You Are the One HDU - 4283题意:由T个测试样例,每个样例有n(1 <= n <= 100)个数d[i] (0 <= d[i] <= 100),如果的d[i]是第k个算贡献,则的d[i]的贡献是(k - 1)* d[i],先在给你一个栈,你可以任意时间把d[i]放入栈中或从栈中取出,以此来控制算贡献的顺序。求最小贡献。思路:f[i][j]表示把区间 [i, j] 翻转过来的贡献和,栈的作用就是把进栈的区间 [i, j]翻转顺序。dp[i][j]表

2020-11-18 22:52:12 80

原创 区间dp -- Food Delivery ZOJ - 3469

Food Delivery ZOJ - 3469题意:在一条笔直的街道上有有一个餐馆和 n 户居民,每户居民都会在餐馆订餐,餐馆的坐标为X,参观送餐的速度是1 / V,每户居民都有两个属性x、 b,分别表示自己在街道上的坐标、单位时间内对餐馆送餐速度焦虑值。请你规划一种送餐策略,求所有居民对餐馆最小的焦虑值。思路:每次出发有两种选择,要么向左走到第一个没被送餐的居民,或者向右走到第一个没被送餐的顾客。把餐馆两边的居民分为左右(l、r)两个部分,并按距离由近到远排好序。dp[l][r]

2020-11-18 18:05:29 96

原创 区间dp -- Multiplication Puzzle POJ - 1651

Multiplication Puzzle POJ - 1651 题意:给你 n(2 < n <= 100)个数,求把这n个数删到只剩首尾两个数的代价和,删掉一个数的代价是这个数和与它相邻的左右两个数的乘积。例如:如果有6个数10 、1、50 、20、 5,删数的顺序为 1、20、50,则代价和为:10 * 1 * 50 + 50 * 20 * 5 + 10 * 50 * 5 = 500 + 5000 + 2500 = 8000。如果删数的顺序为 50、20、1,则代价和为:1 *

2020-11-14 16:29:06 140

原创 数位dp(平方和问题) -- 吉哥系列故事——恨7不成妻 HDU - 4507

吉哥系列故事——恨7不成妻 HDU - 4507 题意:有T次询问,每次询问给两个数 l、r(1 <= l <= r <= 1e18),求在 l、r 间所有与7无关数的平方和。与7无关数定义: 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关,都不符合则是与7无关数  1、整数中某一位是7;  2、整数的每一位加起来的和是7的整数倍;  3、这个整数是7的整数倍;思路:dp[pos][sum1][sum2],一维表示一个数从左至右第pos个数位,二维su

2020-11-10 22:01:26 116

原创 数位dp -- Balanced Numbers SPOJ - BALNUM

Balanced Numbers SPOJ - BALNUM 题意:有T次询问,每次询问给你两个数l、r(1 <= l <= r <= 1e19),问你l、r间有多少个平衡数。平衡数定义:0、2、4、6、8等偶数出现奇数次,1、3、5、7、9等奇数出现偶数次,0 ~ 9的中有的数也可以不出现,符合这样的条件称为平衡数。思路:dp[pos][sum],一维表示从左至右第pos数位,二维sum表示0 ~ 9出现情况的状态压缩。如何状压0 ~ 9的出现奇偶情况,用数位长度为10三进

2020-11-10 15:43:06 79

原创 数位dp入门 -- B-number HDU - 3652

B-number HDU - 3652题意:多次询问,每次询问给你一个数n(1 <= n <= 1e9),问你n内有多少个数含有‘13’且能被13整除。思路:dp[pos][sum][ind]。一维表示数从左至右的第pos位。二维sum表示前pos位前缀数模13的值。三维ind,ind = 0表示前pos位前缀数中没有出现’13’、且pos - 1位的数不为1,ind = 1表示前pos位前缀数中没有出现’13’、且pos - 1位的数为1,ind = 2表示前pos位前缀数中出现了

2020-11-09 01:33:41 100

原创 数位dp入门 -- Balanced Number HDU - 3709

Balanced Number HDU - 3709 题意:给你T次询问,每次去询问两个数l, r(0 <= l <= r <= 1e18),问你l,r间有多少个平衡数,平衡数定义:平衡的数字必须与某些数字的支点保持平衡。例如,4139是一个枢轴固定为3的平衡数。左侧部分和右侧部分的扭矩分别为4 * 2 + 1 * 1 = 9和9 * 1 = 9。思路:dp[pos][sum], 一维表示一个数从左到右第pos位,二维sum表示支点左右相加后的平衡值,支点左边的数设为正,右边

2020-11-09 00:24:31 117

原创 数位dp -- Beautiful numbers CodeForces - 55D

Beautiful numbers CodeForces - 55D题意:每次问你在[l, r]的区间类有多少美丽数,我们将定义美丽数是一个可以被自己每一位上非0的数整除。l, r的范围是9 * 1e18级。思路:数位dp思路一个的数由0 ~ 9组成,一个数可以同时被1 ~ 9中的若干数整除,等同于该数可以被它们的最小公倍数整除。dp[pos][sum][lcm],一维pos表示从高位到低位的第几个数,二维sum表示一个到前pos位的前缀数,三维lcm表示前pos位的每一位数的最小公

2020-11-06 21:18:17 84

原创 简单dp(使序列单调成本最值求解)-- Making the Grade POJ - 3666

Making the Grade POJ - 3666题意:给你一个个数为n的序列,序列的每个数可以随意加减,其加减值算作成本,问你把序列变成不严格的单调上升序列的最小成本。思路:先对原序列a离散化,即排序去重存在数组b中,dp[i][j]表示把序列a的前i个数的最大值(即a[i])变成b[j]所积累的总成本,dp转移式为:dp[i][j] = min(dp[i][j], mi + abs(a[i] - b[j])),其中mi = min(mi, dp[i - 1][1 ~ j])。为什么只

2020-10-25 11:30:21 147

原创 对称矩阵dp -- Phalanx HDU - 2859

Phalanx HDU - 2859题意:给你一个n * n 的矩阵。矩阵由大小写字母组成,找关于左下角到右上角对角线对称的矩形,求能找到的最大的矩形大小。思路:观察矩形对称的特点,dp[i][j]存以(i, j)为右下角的最大对称矩形大小,从左上到右下递推,转移式为 dp[i][j] = k,显然k不会超过 dp[i - 1][j + 1] + 1,code:#include<iostream>#include<cstdio>#include<cstdlib&

2020-10-24 15:30:41 150

原创 简单记忆化 -- FatMouse and Cheese HDU - 1078

FatMouse and Cheese HDU - 1078题意:给你一张 n * n 的图,每个点都有一个权值,老鼠从矩阵

2020-10-24 13:36:34 121

原创 简单dp -- Treats for the Cows POJ - 3186

Treats for the Cows POJ - 3186题意:给你一列数,有n个,可以从两头取出,第i个数对答案的贡献为a[i] * cot,cot是a[i]第cot次取到,答案为每个数的贡献和,求采取最佳的取数策略得到答案最大值。思路:dp[i][j]表示从数列左端取到数a[i]、右端取到a[j]时积累的最大贡献。状态转移式为:dp[i][j] = max(dp[i - 1][j] + (i + (n - j + 1)) * a[i], dp[i][j - 1] + (i + (n -

2020-10-24 00:21:52 133

原创 简单dp -- Help Jimmy POJ - 1661

Help Jimmy POJ - 1661题意:Jimmy从最高点(x, y)跳到地面,但高度不能超过MAX,否者jimmy会跳死,所以jimmy可能要借助给出的n与地面平行的平面,平面的高度为h,水平范围从x1到x2。jimmy在水平和竖直方向的运动速度都是1m/s。求jimmy跳到地面的最小时间。思路:把最高点(x, y)视为一个(x1, x2, h) = (x, x, y)的平面,按高度从低到高给这n + 1个平面排序,dp[i][0]表示从下面平跳到i平面左端点的最少花费时间,dp[i][1

2020-10-23 16:10:05 81

原创 简单dp -- Common Subsequence POJ - 1458

Common Subsequence POJ - 1458 题意:给你s, t两个字符串,求出两个字符串的最长公共子串,子串的原串字符按原串顺序组成的。思路:dp[i][j]记录s串第i个字符匹配到t串第j个字符的最长公共子串长度,把s串的字符与t串的字符挨个比较,若s[i] == t[j], 则此时匹配的最长字串为dp[i][j] = dp[i - 1][j - 1] + 1,否则dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])。code:#inclu

2020-10-22 23:57:19 178

原创 01背包 -- Jury Compromise POJ - 1015

Jury Compromise POJ - 1015 题意:从n个人里选m个人,每个人都有p,d两个属性,要求m个人的p[i] - d[i]之和最小,在此基础上p[i] + d[i]之和最大思路转换为01背包问题,首先将p-d差值转换为“体积”,p+d 转化为“价值”。设dp[i][j][k] :表示从前i个人中选了j个人他们的差值为k。 里面就保存了最大价值,即p+d的和。那么每次有2种转移:第一种: 不选第i个人,那么从 dp[i - 1][j][k] 转移来第二种: 选第i个人人,那么

2020-10-22 19:55:49 92

原创 最长上升子序列 -- 最少拦截系统 HDU - 1257

最少拦截系统 HDU - 1257题意:给你一个数列,问你最少有几个单调递减序列(反过来就是单调递增)。思路:单调递减的特点就是后面的数小于等于前面的数,那么我们只要找到一个严格单调上升数列,并统计上升数列的元素个数就行了,这些元素就是单调递减数列的第一个元素。code:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath

2020-10-21 14:13:51 95

原创 状压dp -- Doing Homework HDU - 1074

Doing Homework HDU - 1074 题意:有n门课程的作业,每门作业都有截止时间和做作业花费时间,当到截至时间该作业还没做完时会扣除延期时间数量的分数,问按怎样的顺序来做扣除的总分数最短,输出最短时间,完成作业的顺序(按字典序输出)。思路:状态压缩作业的完成情况,二进制位上的1表示对应作业完成,共有(1 << n)- 1种作业状态,从1到 (1 << n)- 1dp过去,状态转移式为:p[i].dp = min( p[i].dp, p[i ^ (1 &lt

2020-10-19 22:05:04 80

原创 最短路 +网络流 -- Marriage Match IV HDU - 3416

Marriage Match IV HDU - 3416题意:给你一张节点为n、边数m的为有向图,每条边只能走一次,问该图的最短路有几条。思路:显然,我们先要找出所有与最短路有关的边,再建图跑最大流。关键是如何找出所有与最短路有关的边,对于这张有向图我们正向、反向各建一遍,用spaf算法各跑一遍最短路。那么与最短路有关的边满足 w + dis1[u] + dis2[v] = min_dis,即一条边的权值 + 源点到该边的前继节点u正向最短路 + 汇点到该边的后驱节点v的反向最短路 = 源点到汇点的

2020-10-11 14:29:18 104

原创 二分 + 网络流 -- Marriage Match II HDU - 3081

Marriage Match II HDU - 3081题意:输入n, m,f。表示有n个女生和n个男生,m行u, v表示编号u和v的女生和男生可以结婚,f行u,v表示编号为u,v的女生相互是朋友,朋友关系具有传递性,对于女生来说朋友的结婚对象也可以是她的结婚对象,问可以有多少中不同的结婚组合方式。思路:简单来说这里是要求最大匹配数,对女生和可以和她结婚的男生连边,权值设为1,然后二分源点到女生的边的权值,权值表示每个女生最多可以与多少个男生结婚。跑最大流判断是否满足。code:#inclu.

2020-10-10 21:49:13 118

原创 状压 + 网络流 -- Escape HDU - 3605

Escape HDU - 3605题意:n个人移民到m个球上,对于每个人来一些星球是他可以移居的,有些不可以,每个星球的承载能力也是有限度的,问n个人是否可以全部完成移居。n是1e6级别的,m是1e1级别的。思路:显然是网络流或二分匹配(其本质都是找增广路),我们这里选择网络流解决,但n 是1e6级别的,以人为节点建图跑网络流显然会超时,然而我们注意到m是1e1级别的,我们可以以人们对m个星球的移居状态来状态压缩,10个星球,所有的状态组合也只有2^10 = 1024,那么有状态组合为节点来建图完全

2020-10-09 23:54:50 3931

原创 网络流最小割 -- Control HDU - 4289

Control HDU - 4289题意:在一张双向交通网络图中,在交查路口都要安排一个警察来监视,每个路口警察都有不同的花费,要求监视到所有的车辆人员,求最小花费。思路:其实这里利用网络流的流量是其路径上的最小容量限制的(即我们说的割),用网络流来找到最小花费,我们拆点为边,把点拆为入点和出点,把放置警察的花费作为边的容量,道路是双向的,从一个点的出点到另一个点的入点,容量设置为无穷inf建图跑网络流就可以了。code:#include<iostream>#include&l

2020-10-08 14:07:55 112

原创 网络流isap算法 -- Island Transport HDU - 4280

Island Transport HDU - 4280 题意:给一张图,求最大流思路:isap算法模板code: #include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<algorithm>#include<queue>using namespace std;const int maxn = 1e5 + 5;str

2020-10-04 14:58:32 122

原创 最小费用最大流 | 二分图HK算法 -- Going Home POJ - 2195

Going Home POJ - 2195题意:在 n * m的矩阵上有 k个人和k所房子,一所房子只能待一个人,人可以上下左右的移动,求让每个人都走到房子里的最小总步数,注意可以经过房子所在的格子不进入房子。思路:跑最小费用最大流,人到房子的距离为边权,人房边的容量为1建图,再建立超级源点0连接每个人,边权为0, 边的容量为1,建立超级汇点201连接没所房子,边权为0,边的容量为1,用最大流限制人和房子的一一对应关系,同时用一边权跑最短路,每次找到一条最短路,直到跑完最大流。#include&l

2020-10-02 21:04:49 359

原创 一般图最大匹配模板 -- 带花树

问题:对于一个图G(V,E),它的匹配M是二元组(u,v)组成的集合,其中u,v∈V,(u,v)∈E,并且M中不存在重复的点。当|M|最大的时候,我们称M为G的最大匹配。当G是一个二分图的时候,它的最大匹配可以用经典的匈牙利算法或网络流算法求解。然而当G是一个一般的图时,直接进行增广就变得不可行了,例如下面这个例子:这个问题出现的原因,就是一个一般图中会含有奇环,即一个点数为2k+1,k>0的环,而如果经过一个奇环,那么会得到两条含有同一个点的匹配边,这其实是不符合定义的。那为什么二分图可以

2020-08-24 15:20:19 155

原创 二分图 最佳匹配 KM算法模板 -- HDU 2255 奔小康赚大钱

HDU 2255 奔小康赚大钱题意:n个村民重新分配n间房子,接下来n行表示,第i个村民对第j个房子出的价格,问怎样才能使村里的机构获得最大收入。思路:KM算法模板。KM算法详解:https://www.cnblogs.com/fzl194/p/8848061.htmlhttps://www.cnblogs.com/fzl194/p/8834847.htmlcode:#include<iostream>#include<cstdio>#include<c

2020-08-19 21:42:50 209

原创 二分 + 多重匹配 / 网络流 -- POJ2112 Optimal Milking

POJ2112 Optimal Milking题意:K个产奶机,C头奶牛,每个产奶机最多可供M头奶牛使用;并告诉了产奶机、奶牛之间的两两距离Dij(0<=i,j<K+C)。如何安排使得在任何一头奶牛都有自己产奶机的条件下,奶牛到产奶机的最远距离最短?最短是多少?思路:二分答案,这里可以用二分图的多重匹配判断,也可以建图跑网络流。二分 + 多重匹配#include<iostream>#include<cstdio>#include<cstdlib

2020-08-17 16:20:36 96

原创 二分 + 多重匹配 -- POJ - 2289 Jamiemeigeren‘s Contact Groups

POJ - 2289 Jamie’s Contact Groups题意:有n个人,分为m组,每个可以被归到一些组里,但最终每个人只能归到一个组,求人数最多组的人数最少是多少。思路:二分人数,多重匹配判断。多重匹配:右边的组可以匹配多个左边的人。当每组的人数不够mid的话直接匹配就行。 若已经达到mid,那么看是是否还能寻找到增广路,若能找到就进行替换。code:#include<iostream>#include<cstdio>#include<cstdli

2020-08-16 23:06:52 311

原创 二分专题 最小可重复路径点覆盖 -- HDU1151 Air Raid

HDU1151 Air Raid题意:给你一个有向无环图,选择一些人(可以从任何点出发),问最少需要多少人可以走遍所有节点。即求出最少的路径将所有点覆盖至少一次。思路:最小可重复路径点覆盖 = 点数 - 最大匹配数,要用floyd求闭包,在跑匈牙利求最大匹配。code:#include<iostream>#include<cstdio>#include<cstdlib> using namespace std;const int maxn = 1

2020-08-16 13:47:26 213

原创 最小点覆盖 -- HDU 1054 Strategic Game

HDU 1054 Strategic Game题意:给你一个n个节点的多叉树,士兵站在节点上,问你至少要多少士兵就能监视多叉树上的所有边。思路:最小点覆盖裸题,最小点覆盖 = 二分图最大匹配。code:#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;const int maxn = 1505;struct edge{ int u, v, next;} g

2020-08-15 17:06:13 107

转载 有向无环图(DAG)的最小路径覆盖(最小不相交、最小相交)

DAG的最小路径覆盖定义: 在一个有向图中,找出最少的路径,使得这些路径经过了所有的点。最小路径覆盖分为最小不相交路径覆盖和最小可相交路径覆盖。最小不相交路径覆盖: 每一条路径经过的顶点各不相同。如图,其最小路径覆盖数为3。即1->3>4,2,5。最小可相交路径覆盖: 每一条路径经过的顶点可以相同。如果其最小路径覆盖数为2。即1->3->4,2->3>5。特别的,每个点自己也可以称为是路径覆盖,只不过路径的长度是0。DAG的最小不相交路径覆盖:算法: 把原

2020-08-14 15:00:42 1183

转载 二分图论总结 -- 最大匹配、最小点覆盖、最少边覆盖、最大独立集

https://blog.csdn.net/qq_41730082/article/details/81456611https://blog.csdn.net/huangshuai147/article/details/51087275/

2020-08-14 13:25:58 191

原创 博弈 -- hud6850 Game

hud6850 Game题意:在直角平面坐标系中n个坐标,两个人博弈,从第一个点开始跳到其他的点上,每个点只能被经过一次,且一个点到下个点的距离要大于这个点到上一个点的距离才能跳。两人轮流跳,最后谁不能再跳了谁就输了,先手赢输出“YES",后手赢输出“NO”。思路:给每个点标号1 ~ n,n个点建完全图有n * (n - 1) / 2条边,每条边按距离权值从大到小排序,每次选择当前距离最大且未标记的边标记为真,与真边直接相邻且为标记的边标记为假边,直到所有边标记完,检查1号点所有边中是否有真边,有

2020-08-12 00:17:16 82

原创 队列尺取法 -- F Groundhog Looking Dowdy

F Groundhog Looking Dowdy题意:有n天, 每天选一件衣服,有k件衣服可供选择,每件衣服都有个权值。在n天中有m天你要外出约会,求这m天中你衣服权值的极差(衣服权值的 (最大值 - 最小值))的最小值。思路:题意要求极差最小,这意味着m天衣服的权值间隙要尽可能的小,(比如最佳的情况是连续的),那我们就开个结构体数组,记录每件衣服的权值和所属日期。按衣服权值从小到大排序。依次将数据压道队列中,当刚好压到有m个不同日期的衣服时,把该天衣服的权值 - 队首第一个不同日期的最后一件衣服

2020-08-09 22:45:51 100

原创 分解素数 + 思维 -- E Groundhog Chasing Death

E Groundhog Chasing Death题意:题目大意:给出 a , b , c , d , x , y ,求思路:分解 x, y 的公共质因数,因为分解出来的质因数总事不变,我们只需要记录每个质因数的幂次和,在快速幂求贡献,把每个质因数的贡献相乘就是答案了。但这题有个坑,就是幂次和会爆long long ,要用费马小定理降幂。费马小定理:a^(p−1)≡1(mod p),把素因子的个数对“mod-1”取模即可。具体实现:看到这题的第一想法是两层循环嵌套枚举[a, b],[c, d]

2020-08-09 20:39:49 100 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除