自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SPOJ - LCS2 - Longest Common Substring II

题面题意给出最多十个字符串,求它们的最长公共子串.做法大致思路是对第一个字符串建出后缀自动机后,每个字符串都去匹配,对于自动机上每一个节点都用一个临时数组求出它所能匹配到的最长后缀长度,每个字符串匹配完后临时数组与上一次匹配后的结束状态取一个最小值. 一开始TLE了一次,WA了一次. TLE那次我更新临时数组上的某个点时,沿着它的fail向上更新了所有点,这样对于极限数据将会退化成O(n^2),

2018-03-31 19:06:25 215

原创 洛谷 P4092 [HEOI2016/TJOI2016]树

题面题意给出一棵树,两种操作,给节点打标记(1为根,初始仅1打了标记),询问祖先中距离他最近的打了标记的节点做法这题可以用暴力水过去,也可以用树链剖分来做. 但利用并查集可以十分巧妙地解决这题. 首先可以发现随着询问的进行,每点的答案将会被分成越来越多块,而倒过来进行的话则会发现块数将会越来越少直到最后的一块,且每次都是两块并成一块,因此我们可以记录下操作后用并查集维护,若一个点打了标记,则其父

2018-03-30 16:49:16 331

原创 Tsinsen A1393. Palisection

题面题意给出一个字符串,求其中相交的回文串的对数.做法可以反过来考虑,求出不相交的所有回文串对数,最后再用总数减去. 首先可以建一个回文自动机,求出再i点左边有几个回文串,然后再将字符串倒过来建一个回文自动机,求出以每个点为左端点的回文串的个数,将上下两个量分别相乘即可求出不相交的回文串的个数.代码#include<iostream>#include<cstdio>#include<cstri

2018-03-30 15:53:07 262

原创 Palindromic Tree 回文自动机-回文树

作用回文自动机,顾名思义,用于解决回文串的问题,可以用于处理回文串的数量,种类数等问题.构造方法与其他自动机差不多,一般记录son[字符个数] (在左右两边加入某字符后匹配的节点),len(长度),fail(失配后所到达的节点,也就是这个回文串的最长回文后缀). 一开始有两个节点,长度分别为0(偶数长度的回文字符串的起始点)和-1(奇数长度的回文字符串的起始点,定为-1可方便后面的计算) 新加入

2018-03-29 19:42:04 301

原创 世界树

题面题意给出一棵树,每次给出其中一些点成为控制点,每个点被距离它最近的控制点控制(若到多个控制点的距离相等则视为被编号最小的控制点控制),输出每个控制点控制了几个点.做法因为每次询问书树上的一些点,因此不难想到用虚树. 树上的点可以说有以下几类: 1.不属于虚树的根节点的子树的点,用n-size[root]即可求出 2.被压缩在虚树的边上的点或者属于一棵根节点被压缩在虚树的边上但不包含虚树上的

2018-03-26 20:36:32 453

原创 虚树

作用针对有q次询问,每次询问树上的m个点的信息的题目,如世界树,可以每次将询问的这些点和这些点两两之间的lca(O(m)个点)单独拿出来建一棵虚树,然后在虚树上贪心或是dp来解决,其复杂度为询问总点数*log询问总点数+在虚树上操作的复杂度.建法首先将所有询问点按dfs序排序,用栈维护刚刚扫过的一条链,然后求出此时要加入的点与栈顶节点的lca,然后不断pop(并且在pop的同时加边)直到栈顶元素为l

2018-03-26 20:17:15 227

原创 bzoj 1863 [Zjoi2006]trouble 皇帝的烦恼

题面题意现在要造k种东西分给围成一个圈的人,每个人要a[i]个,要求相邻的两人分到的东西的种类完全不同,求k最小值.做法如果是链则答案为相邻两数和的最大值,但因为是环,所以最后一人对第一个人有影响,也就不能简单地取最大值. 可以贪心地想,另第一个人分到的东西种类成为特殊物品,要使1和n相同的数为0,就要求第n个人特殊物品最少,就要求第n-1个人分到的特殊物品数最多,第n-2个人分到的最少……这样就

2018-03-26 13:27:08 256

原创 可持久化并查集

介绍可以查询并查集的历史版本,即几次操作之前的连通状态,有在线与离线两种不同算法.离线算法相比于在线算法,时间复杂度与空间复杂度均要优越得多,若要查询第k次操作之后的状态,则可以视为k节点与此节点相连,否则视为上一节点与此节点相连,则这样将会形成一棵树,记录时用启发式合并,将较小树向较大树合并,而且不进行路径压缩,这样复杂度为O(n*logn),dfs一遍即可.代码(以洛谷 P3402 【模板】可持

2018-03-22 18:48:15 263

原创 CodeForces 845G

题面题意给出一张无向图,求从1-n的所有路径中的边权X-or最短路.做法可以从环上来考虑,如果有环,那么就一定可以0代价的异或这个环的权值,因此我们可以用dfs建出一棵搜索树,求出1到每个节点的距离,若找到环,则求出它与已经找到的环的异或最小值,非零则当作这个环的权值,记入已找到环的集合中,之后再求出1到n的距离与所有环的X-or最小值即可.代码#include<iostream>#include

2018-03-22 09:26:41 235

原创 BZOJ4504 k个串

Description兔子们在玩k个串的游戏。首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次)。 兔子们想知道,在这个数字序列所有连续的子串中,按照以上方式统计其所有数字之和,第 k大的和是多少。Input第一行,两个整数n和k,分别表示长度为n的数字序列和想要统计的第k大的和 接下里一行n个数a_i,表示这

2018-03-17 15:50:47 388 1

原创 洛谷 P2048 [NOI2010]超级钢琴

题面题意给出一个序列,求和最大的k个连续子序列的和,且连续子序列长度在l与r之间.做法首先预处理出前缀和,我们可以从左端点开始考虑,若左端点为i,则右端点在i+l-1与i+r-1之间,那么可以计算出这些区间的最大值,然后放到堆里去,每次从堆中取出最大值加到ans中后再将该区间左右两区间的最大值放入堆中. 也就是说我们维护一个结构体(i,l,r,mx)表示左端点为i,右端点在l,r之间的,且这些区间

2018-03-16 20:05:40 363

原创 BZOJ4502 串

Description兔子们在玩字符串的游戏。首先,它们拿出了一个字符串集合S,然后它们定义一个字 符串为“好”的,当且仅当它可以被分成非空的两段,其中每一段都是字符串集合S中某个字符串的前缀。 比如对于字符串集合{“abc”,”bca”},字符串”abb”,”abab”是“好”的(”abb”=”ab”+”b”,abab=”ab”+”ab”),而字符串“bc”不是“好”的。 兔子们想知道,一共

2018-03-15 18:43:23 513

原创 后缀自动机

作用常用于处理字符串问题,可以高效解决许多字符串问题。实现方法有点像将一个字符串的所有后缀都建在一个AC自动机上,但不同的是后缀自动机的节点数最多为2*n,因为它只记录需要记录的点,一些没有记录东西的点可以视为与下面有价值的节点并在一起,这样大大降低了时间复杂度和空间复杂度。 对于每一个节点记录它的后面加上每个字符后后缀最长可以到达的节点,以及它的长度len,它去掉一个最短前缀后存在的节点pre。

2018-03-14 23:47:47 331

原创 无旋treap

作用一种平衡树,可以只利用合并与拆分两种操作实现插入删除等所有二叉查找树可以做的事情.实现方法treap=tree+heap,利用tree来保持二叉查找树的功能,再利用heap来保证它是平衡树. 每个节点保存两个值,一个是题目给出的,要储存的值,还有一个是rand的且长期不变,建树时储存的值根据二叉查找树的性质来保存,同时保证rand()的值符合堆的性质,每个根为该子树的极值,这样就可以保证树的平

2018-03-14 14:40:14 305

原创 AC自动机

作用用于处理多个字符串匹配,例如给出一些关键单词,再给出一篇文章(或多篇),问文章内的出现了几个单词或一共出现了几次.实现方法可以说是KMP与字典树的结合,就好像利用字典树存储多个字符串的next数组. 首先将所有关键单词建一棵字典树,每个节点除了存储26(字符种类数)个儿子外,还要储存sum和fail. sum用于记录此节点是否是某个关键词的尾字符,并且也可以顺便储存此字符串的个数 fail

2018-03-13 19:37:10 194

原创 洛谷 P2765 魔术球问题

题面题意有n个柱子,编号为1,2…….的小环,要将它们依次套在环上,要求直接接触的两小球的和为完全平方数,那么最多可以套几个小球。做法首先可以贪心,如果可以套在其他小球上,则套在其他小球上,反之,套在柱子上,直到没有多余柱子,可以证明这是对的,但我觉得还是网络流的做法比较重要。 因为要依次取小球,那么当答案为ans时,编号为1-ans的小球都被取走,我们可以用类似于洛谷 P1251 餐巾计划问题的

2018-03-12 23:49:25 298

原创 2-SAT

解释 对于布尔方程(aVbVc…….)^(dVeVf……)^………,我们称(aVbVc…….),(dVeVf……)为子句,a,b,c,d,e,f…..为文字,若每个子句的文字均不超过两个,那么求解这样的方程被称为2-SAT. 此算法可以利用强连通分量高效求解这类方程.实现方法 若aVb=1,我们可以发现当!a时,b必须为1,当!b时,a必须为1,也就是说,若!a为真,则b为真,若!b

2018-03-11 20:54:26 331

原创 Kosaraju求强连通分量,缩点

作用 只要两边dfs,相比于用tarjan求强连通分量,kosaraju算法还可以顺便求出强连通分量的拓扑序,有利于之后的运算.实现方法 首先以任意一点开始dfs,并记录下搜索的后序遍历,之后将所有边反向,每次从没有搜过的点中选择后序遍历最大的搜索,此次搜到的点均与该点属于同一个强连通分量,直到所有点都被搜到过停止,可以发现越先求出的强连通分量,拓扑序越小.例题(poj 2186)题意

2018-03-11 19:37:41 409

原创 Tarjan求强连通分量,缩点

强连通分量 是指在一张图图中任意两点都可以两两互相到达.作用 在一些问题中因为两两可以互相到达的性质,可以将一个强连通分量当做一个大点来做.Tarjan 与tarjan算法求割点的做法相似,遍历时记录一个时间戳和一个low记录不经过祖先节点可以到达到的时间戳最小的点,遍历时再将扫到的点放入一个栈中,并用一个布尔数组记录这些点. 若时间戳与low相等,则不断pop直到当前点被po

2018-03-11 15:35:07 314

原创 高度数组

解释及作用 是后缀数组中相邻两个字符串的lcp(最长公共前缀),可以在O(n)的时间内高效求出,帮助做一些字符串匹配问题。 h[i]=lcp(st[i],st[i+1])(st表示后缀数组中表示的字符串)实现方法 如果已经知道后缀数组中i与i+1的lcp为h,那么i代表的字符串与i+1代表的字符串去掉首字母后的lcp为h-1.根据这个我们可以发现,如果知道i与后缀数组中在它后一个的l

2018-03-11 11:42:52 540

原创 后缀数组

解释及作用 对于一个字符串,将其所有后缀排序,用后缀中的第一个字符代表这个后缀,那么排序后的数组就是后缀数组,例如,对于字符串ababs,它的后缀数组是1 3 2 4 5,因为 1.ababs -开始位置为1,排名第1 2.babs –开始位置为2,排名第3 3.abs—-开始位置为3,排名第2 4.bs——开始位置为4,排名第4 5.s——–开始位置为5,排名第5

2018-03-08 23:32:09 239 6

原创 洛谷 P3286 [SCOI2014]方伯伯的商场之旅

题面题意 给出l,r,k,求将l与r之间的数进行x操作的最小代价. x操作指将一个数转化为k进制,表示有几堆石块,每对石块恰有该数位上的数个石子,相邻两堆距离为1,将它们并成一堆,代价为石头数量*距离.做法 因为l和r的范围都高达1e15,故考虑数位dp,而此题难点就在于难于记录状态. 一开始想到的是枚举集中在哪一位集中和代价之和,再分别相加,而因为一个数可以在代价不变的情况下

2018-03-08 18:31:08 396 1

原创 洛谷 P3288 [SCOI2014]方伯伯运椰子

题面题意 给出一幅有向图,有一源点(仅一条边与之相连且这条边不可修改)和一汇点,每一条边有一个流量,单位流量所需费用,每额外增加单位流量所需费用和每减少一流量所需费用,给出的图保证所有所有边均满流,现在要修改一些边(改变流量),使修改后的所有边依然满流,且使修改后费用减少量除以修改流量之和的商最大.做法 可以将问题转化,减少边的流量相当于退流,增加边的流量相当于增广,因为与源点相连的边不可

2018-03-08 15:15:34 338 2

原创 洛谷 P1430 序列取数

题面题意 给出一个序列,两人轮流从一端开始取任意个数,最后所取数的和即为得分,两人都想要较高得分,则先去者的最高得分是多少。做法 首先不难想到用dp[i][j]表示序列剩下从i到j这段时的最高得分,这样的话有n^2种状态,n的状态转移,总复杂度为n^3,会T。 因此可以考虑记录下述值: le[i][j]表示从左边开始取,剩下的数取到的最高分的最小值,也就是说: le[i]

2018-03-07 23:28:46 445 1

原创 点分

作用 在树上实现,通过分治的方法,使原来需要复杂度为n^2的做法变为n*logn.实现方法 首先找到树的重心,然后以重心为根,考虑需要用到根的部分,之后去掉根节点,将原来子树分成多个小于原来大小的一半的多棵子树,再用上述方法反复处理,不难证明复杂度为n*logn. 因此点分的核心代码就是统计每个点的子树大小和找到根节点.void getsz(int now,int last){

2018-03-07 17:45:21 1705

原创 km算法求带权二分图的最大匹配

做法 可以与匈牙利算法类比. 首先每一个匹配点都有一个期望匹配值为与它相连的所有边的最大搭配值,所有被匹配点的期望匹配值均为0. 然后如果匹配点与被匹配点的期望值之和恰好为该匹配值,则可以匹配,用匈牙利算法来求,如果没有找到则让参与此次失败匹配的点中的匹配点加上k,被匹配点减去k,k为产生一个合法匹配还需要的最小值(在代码中用need表示),全部匹配完后输出答案即可代码#inclu

2018-03-05 21:01:56 271

原创 tarjan算法求割点

割点 在一张无向图中,如果去掉某一个点后使这张图的连通分量增加,则说明这个点是割点,也就是说去掉这个点后,使原本连通的两块不连通.做法 首先任意找一点为根,以此点开始dfs,对每一个点记录两个值: 1.它是第几个被(首次)访问到的,也就是时间戳.用num表示 2.它不经过父节点所能达到的最小时间戳.用low表示 如果一个点(非根节点)的子节点的low大于等于这个点的时间戳

2018-03-05 07:27:51 495

原创 洛谷 P3356 火星探险问题

题面题意 给出一张地图,上面有一些石块或障碍,现在有一些运载车从左上角出发,要去右下角,只能向右或向下走,每个石块只能收集一次,输出收集到最多石块的路径.做法 多个运载车,不难想到是网络流,但难点在于每个石块最多收集一次,而且要收集最多石块. 可以用费用流来做,每个点拆成两个入点向出点连一条流量为INF,费用为0的边,如果该地有石块,则再连一条流量为1,费用为-1的边,最后跑费用流,

2018-03-03 17:37:11 269

空空如也

空空如也

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

TA关注的人

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