
算法
文章平均质量分 82
Lndulge.
一个蒟蒻 OIer
还在努力中 noip加油!
这个博客用来记录笔记和做的题。。
展开
-
[转] 最长回文子串——Manacher算法
转自https://segmentfault.com/a/1190000003914228 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度。如果一个字符串正着读和反着读是一样的,那它就是回文串。下面是一些回文串的实例:12321 a aba abba aaaa tattarrattat(牛津英语词典中最长的回文单词) 1. Brute-force 解法 对于最长回文转载 2017-05-17 18:27:39 · 579 阅读 · 0 评论 -
[vijos 1599]: 货币(记忆化搜索+hash优化)
背景又是一道水题描述在某个神秘的星球上有一种货币,它有一种奇怪的兑换规则你有且仅有一枚面值为n的金币,你可以去银行进行兑换,也可以不兑换如果去银行兑换,兑换的规则是这样的:用面值为a的金币去兑换可以换到a/2,a/3,a/4这三枚硬币(如果是小数则截尾取整),你可以兑换多次读入n输出你最后最多能拥有的钱数w每个测试点中有T组数据格式输原创 2017-06-08 16:23:42 · 462 阅读 · 0 评论 -
[笔记]: 差分约束
差分约束系统形如这个样子:X1 - X2 X1 - X5 X2 - X5 X3 - X1 X4 - X1 X4 - X3 X5 - X3 X5 - X4 比如要求满足此条件的 x1x2x3x4x5和的最小值怎么做呢? 此时 把式子传化一下 如 X4-X5>=3 (一定带等于) 再变成 X4>=X5+3如求最小值 就是大于等于 小于反之然原创 2017-06-22 21:00:47 · 265 阅读 · 0 评论 -
[笔记]:二分图最大匹配匈牙利算法
二分图最大匹配 km算法模板一个mat数组记录匹配的对象 一个flag数组记录对于当前点是否已经匹配flag数组记得每次清空 至于函数部分有个递归的过程//二分图最大匹配KM算法 /*8 5 51 11 22 12 23 34 34 55 5*/#include#include#include#include#include#include#in原创 2017-06-21 16:37:07 · 469 阅读 · 0 评论 -
[笔记]: dp(动态规划)
一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决原创 2017-06-13 08:09:06 · 332 阅读 · 0 评论 -
[笔记]: 背包问题
背包问题 关于讲解详见dd大牛的背包九讲原创 2017-06-13 11:49:25 · 225 阅读 · 0 评论 -
[练习]: 并查集&最小生成树练习题
等会再补Orz原创 2017-06-06 18:47:33 · 434 阅读 · 0 评论 -
[练习]: 树链剖分练习题
这些是一些树剖的基础题 难度从低到高 初学者一定要做一做。。1.洛谷p3384树链剖分模板//一定记得任何算值的地方取模。。还有注意add和query时候深度小的在前面!不然线段树会卡死 #include#include#include#include#include#include#define ll long long#define N 100005#define l原创 2017-06-07 10:39:59 · 386 阅读 · 0 评论 -
[笔记]: 并查集
自己总结一下吧 并查集核心的就两个部分一个是查int findf(int x){ return fa[x]==x?x:fa[x]=findf(fa[x]);}一个是并void merge(int x,int y){ fa[findf(x)]=findf(y);}话说 并查集叫并查集就是 并和查啊所以就是找爸爸 找爸爸 并爸爸然后就没了啊转载 2017-06-05 16:49:29 · 346 阅读 · 0 评论 -
[noip 2010] 关押罪犯(两种解法)
描述S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c的冲突事件。每年年末,警察局会将本年内监狱中的所有冲突事原创 2017-06-06 18:46:10 · 398 阅读 · 0 评论 -
[笔记]: 树链剖分
树链剖分:对于每个结点 连接子节点多的那个子树的边叫做重边重边连起来成链 叫重链 (不止是只有一条重链) 使用线段树或者其他的数据结构存重链 用此数据结构进行操作 两个dfs操作 : 第一个dfs 求出重链 深度dep数组 父节点fa数组 和每个结点的子结点个数size数组 知道了size才可以求出重链 第二个dfs 连接重链 对于每个重链 重链的标号为第一个结点的编号原创 2017-06-05 16:57:28 · 248 阅读 · 0 评论 -
[笔记]: 记忆化搜索+hash优化&树形dp
1.记忆化搜索记忆化搜索就是搜索过程中记下搜索的值 很简单 没什么好说的下面是一个简单的斐波拉契数列的记忆化搜索代码#include#include#include#include#include#include#define N 100000using namespace std;int f[N];int dfs(int x){ if(f[x]) return f原创 2017-06-07 10:44:55 · 574 阅读 · 0 评论 -
[noip2009]: 最优贸易
P1073 最优贸易题目描述C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为 1 条。C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。但原创 2017-06-15 21:30:58 · 269 阅读 · 0 评论 -
[笔记]: 最小生成树Kruska
转自:http://blog.youkuaiyun.com/lulipeng_cpp/article/details/7800865kruskal算法的精髓在于:每次选取一条边。该边同时满足:1、在当前未选边中权值最小;2、与已选边不构成回路。直到选取n-1条表是算法结束。找到MST活判断不存在MST。 代码设计:1、利用优先级队列将权值小的边放到队列最转载 2017-06-05 16:52:48 · 284 阅读 · 0 评论 -
[笔记]: RMQ算法(区间查询)
1. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j算法。当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。2.RMQ算法对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量转载 2017-06-01 18:06:33 · 418 阅读 · 0 评论 -
[练习] LCA练习1(最基础)
hdu 2586 How Far Away?lca求最短距离(模板题)#include#include#include#include#include#include#define N 40005using namespace std;int n,m;int num=0;int b[2*N],w[2*N],nt[2*N],p[2*N];int fa[N][20],d[N原创 2017-06-02 11:54:52 · 406 阅读 · 0 评论 -
[noip2013] 货车运输(最大生成树+并查集+LCA)
货车运输描述A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。格式输入格式第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道路。接下来 m 行每行 3 个整数 x、原创 2017-06-02 15:18:30 · 530 阅读 · 0 评论 -
[bzoj2144]: 跳跳棋
2144: 跳跳棋Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 689 Solved: 326[Submit][Status][Discuss]Description跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置。我们要原创 2017-06-02 15:53:27 · 563 阅读 · 0 评论 -
[笔记]: LCA最近公共祖先
LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点。也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们就是要求找到公共的节点中,深度尽量深的点。还可以表示成另一种说法,就是如果把树看成是一个图,这找到这两个点中的最短距离。倍增法求LCA(在线做法) 详细见注释/*LCA(Least Common Ancestors)原创 2017-06-01 11:38:50 · 247 阅读 · 0 评论 -
[笔记]: 网络流
详细介绍自行百度下面是两个模板都是poj1273模板题1.E_K 增广路算法//http://poj.org/status#include#include#include#include#include#include#includeusing namespace std;const int N=205;const int inf=1<<29;int n,原创 2017-06-19 16:45:52 · 253 阅读 · 0 评论 -
[笔记]: Tarjan算法求有向图的强连通分量
所谓Tarjan算法建议学习算法竞赛入门经典训练指南中的这一章对此的介绍因为我的解释需要中文十级才看的懂核心就是dfs中记录一个二元组一个叫dfn(就是算法训练入门经典中的pre)还有一个叫lowdfn就是在图中dfs时的时间戳low则是这个点能访问回到的点的dfn的最小值举个例子例如1->45此时的1 4 5 dfn值分别为123 当访问到5的时候lo原创 2017-07-07 21:12:16 · 402 阅读 · 0 评论