
ACM.算法笔记
slowlight93
这个作者很懒,什么都没留下…
展开
-
QuickHull 快速凸包算法
资料http://hivemined.ir/wp-content/uploads/2012/04/convexHull.pdf原创 2014-11-20 12:56:24 · 9897 阅读 · 2 评论 -
【算法笔记】数学·杂
利用Pentagonal Numbers(五边形数定理)计算整数拆分you should know: 分割函数P(n),简单地说就是n的无序拆分数 母函数 //===================// 相关资料 see http://blog.youkuaiyun.com/acdreamers/article/details/12259815 also http://pages.uoregon.e原创 2015-05-26 23:13:48 · 610 阅读 · 0 评论 -
codeforces 310 div1
555B - Case of Fugitive初看是个匹配模型, 有n-1个区间,m个值目标是给每个区间都匹配一个值。。 考虑贪心来搞, 区间按右端点升序排序,这样上界递增 然后从小到大排序桥 对每个区间, 选择可用的最小桥。。扫描过而没有使用的桥就丢到set里 时间复杂度: O((n + m)log(n + m))555C - Case of Chocolate方法一) 用两个线段树存上原创 2015-07-01 12:42:45 · 532 阅读 · 0 评论 -
codeforces 260 div1
456D - A Lot of Games / 455B - A Lot of Gamestag: 博弈,trie+dp A,B进行k轮游戏,每轮的败者取得下轮的先手。第一轮由A先手 思路: 例如, k=2 A若想赢,必须先败给B, 然后取得下一轮的胜利。则要求从初始位置(空串)既可以转移到必败,也可以转移到必胜。 用 canwin[i] 表示当前是否必胜 canlose[i] 表示能否原创 2015-07-10 14:04:45 · 482 阅读 · 0 评论 -
codeforces 257 div1
A - Jzzhu and Chocolate暴力解法: 设横向切成a部分,纵向切成b部分,则 S = floor(n/a) * floor(m/b) a + b - 2 = k floor(n/a) 有不超过 2sqrt(n) 个值,枚举思路:对每个值,取最大的a 可以直接遍历// eg n = 6, [n/(1...6)] -> [6, 3, 2, 1, 1, 1]// [i] ->原创 2015-06-30 01:44:41 · 423 阅读 · 0 评论 -
【算法笔记】总结 - 网络流 Edmonds-Karp 算法和 dinic 算法
边的表示1) 如果要把边单独存在一个buffer里面,并且每条边有一个唯一的编号。 那么通常将正反边存在一起,比如0,1,这样就可以用 id^1 来方便地访问反边了。 2) 也可以对每个节点,存一个 vector<Edge> 其中 rev 是在 to 节点的邻边列表中的编号。 可以只用 cap 记录剩余容量,这样就省掉 flow 了。struct Edge { int to, c原创 2015-07-22 02:21:29 · 1713 阅读 · 0 评论 -
【算法笔记】最短路总结
次短路目前只会用dijstra求解。。(貌似有用spfa的。。 当然如果是DAG, 拓扑排序加DP也是可以的。。次短路的求解和计数hdu 3191这道题有边权为0的情况。 dij所使用的贪心性质:S是目标集合(已经求得最短路或次短路的点),从 V - S 中选估计值最小的一个u,那么d[u]d[u]就是u的最短路长度。 如果边权有0存在, 那么这条性质就无法保证了。。 幸而数据比较特殊, 只原创 2015-08-05 12:29:54 · 616 阅读 · 0 评论 -
【算法笔记】并查集小结
并查集最朴素的用法就是用来维护连通性。 然后可以用在 Kruskal 算法中求 MST。 并查集还可以维护更多信息 1)加上顺序 poj 1456,需要找 1 - i 格子中最靠右的空格。 让每个节点的根代表往左找到的第一个空格。 当一个空格子被占用,维护操作只需要pa[pos] = pos - 1PS:这道题也可以不用并查集,用二分来找 2)为点加上权值 zoj 3261 可以看原创 2015-09-03 16:31:44 · 467 阅读 · 0 评论 -
【log】近期刷题 - 2015.9 - 2015.10
2015 沈阳赛区网络赛hdu 5456 Matches Puzzle Game从低位到高位dp,每次枚举 B,C,维护借位,还有B,C是否到达最高位。 dp(剩余火柴数,是否需要借位,B是否到达最高位,C是否到达最高位)const int N = 500;const int num[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};LL dp[N+原创 2015-10-08 14:56:02 · 550 阅读 · 0 评论 -
【算法笔记】数位dp小结
资料链接:link1:记忆化方式 link2 link3 论文1 论文2 //=====================//数位dp的直观理解对于递推方式的数位dp我是这样理解的。 例如求解 [0, 235)中满足某种条件的数的个数 我们可以按照前缀把[0, 235)的数分为若干类来统计。为了统一概念,假设最高位的前面有个前缀0。把235叫做上限。 1) (0)0** 2) (0)原创 2015-03-14 16:47:41 · 1116 阅读 · 0 评论 -
【算法笔记】acm数学基础
// gcd拓展 an + bm = gcd(a, b)int ext_gcd(int &a, int n, int &b, int m){ if (m == 0) { a = 1; b = 0; return n; } int d = ex_gcd(b, m, a, n%m); b -= n / m * a; return原创 2015-05-26 11:40:37 · 1410 阅读 · 0 评论 -
【算法笔记】Binary Indexed Tree
资料收集topcoder上的教程 上面教程的中译版 WiKi简单说说BIT尽管叫做树,但还是很难形象的把它和树联系起来。而且在初学的时候很难理解lowbit的是怎么来的,为什么要这么维护。。 其实我还是觉得能发明BIT这个东西,确实很奇妙。。。 BIT的主要用途就是维护前缀和,中心思想是用n个节点,每个节点各自负责 2r2^r长的一段连续和。对于一个节点i,r是i最低位的1的位置。 r(1原创 2015-04-15 16:25:41 · 508 阅读 · 0 评论 -
【算法笔记】LCA问题-tarjan 离线算法
reference:http://en.wikipedia.org/wiki/Tarjan%27s_off-line_lowest_common_ancestors_algorithmhttp://scturtle.is-programmer.com/posts/30055.html算法流程:1)读入表示父子关系的树2)储存所有询问3)一次DFS回答所有询问算法的关原创 2014-12-17 12:57:54 · 608 阅读 · 0 评论 -
A*算法
参考:http://www.policyalmanac.org/games/Chine%20Translation%20-%20For%20beginners.html____________________________________________________________暂时只是看了A*介绍, 怎样确定好的h函数才是关键吧。。暂时感觉还没必要写A*, 就先放原创 2015-01-26 16:22:57 · 434 阅读 · 0 评论 -
压缩矩阵
使用条件:当只使用 (i,j) ,i #define F(i, j) (((i)+1)*(i)/2+(j))int mat[Maxn*(Maxn+1)/2+Maxn];用F(row, col)来访问矩阵。 (0 based)原创 2015-02-05 17:55:45 · 466 阅读 · 0 评论 -
分块思想
----------------------------------------------------------线性分块, 国外通常把块大小为 sqrt(n) 的分块方式叫做 “SQRT Decomposition”。资料:《入门经典:训练指南》P395http://sysmagazine.com/posts/138946/题目:Uva 12003 Arra原创 2015-01-19 21:52:37 · 661 阅读 · 0 评论 -
【图论小结】
图的保存边的表示// 适用于一般情况的边的表示// 根据不同的情况有不同的变体struct Edge { int from, to, cost;}邻接矩阵d[from][to]=costd[from][to] = cost 最简单的方式,适用于密集图 缺点:内存消耗是O(V2)O(V^2),点太多会存不下静态邻接表貌似有很多称呼,我觉得还是这个比较贴切。 优势: 直接访问从某个原创 2015-03-26 00:05:23 · 462 阅读 · 0 评论 -
【算法笔记】双调欧几里得旅行商问题
reference: 1)《算法导论》15-3 2)http://blog.sina.com.cn/s/blog_51cea4040100gkcq.html将所有点按x坐标从小到大排序后(假设不存在重复)。从左至右标记为0, 1, 2…n-1 那么这问题的关键一个性质是,对于一点i(i > 0)和任意包含它的双调路径,i-1一定是i的前继或者后继。 如果我们假设一个环游的顺序,比如逆时针原创 2015-03-03 13:06:24 · 881 阅读 · 0 评论 -
【算法笔记】伸展树 Splay Tree
资料基本入门的就去看看: 《The Magical Splay》、《伸展树的基本操作与应用》吧 参考code: 有top-down和down-top两种,貌似竞赛里面都写自底向上的,可能是好维护size把。。 我用的是CLJ风格的。。。(他的代码太精炼了。。struct node { node *ch[2], *p; // 左右子节点,父亲节点 int key原创 2015-04-21 23:50:23 · 516 阅读 · 0 评论 -
【算法笔记】Size Balanced Tree
资料: C++实现 Size Balanced Tree PPT 论文译文练习题目: poj 3481原创 2015-04-19 00:22:53 · 854 阅读 · 0 评论 -
kosaraju算法-求解有向图SCC
算法流程:1)制作反图2)任选一个没有标记的节点,正向dfs,在回溯之前打上时间标记(叶子的标记在前)3)重复2直到所有点被标记4)选择时间标记最大,且没有被加入连通块的点,连通块计数器加1, 反向dfs,将访问到的点加入当前连通块。5)重复4直到所有点被加入连通块-------------------------------------------------------原创 2015-02-05 16:55:26 · 805 阅读 · 0 评论 -
【算法笔记】最小生成树
常用的求MST算法1)Prime 复杂度:v^2 和Dijstra一样可以使用priority_queue优化。优先队列优化后为,vlogv 2)Kruskal 复杂度:elogeMST唯一性判定如果不存在权值相同的边,则MST唯一。可以用 Kruskal 证明。 MST的多解是由权值相同的边互相替换而不改变连通性而得来的。 1) Prime可以判定不唯一。 2)Kruskal可以判断原创 2015-05-11 20:35:26 · 497 阅读 · 0 评论 -
[log] lightOJ 刷题
动态规划1073 - DNA Sequence 题意: n个只含A,G,C,T的string。求一个长度最短的串使得给出的字符串都是其子串。相同长度的输出字典序最小的。 思路: 压位dp 注意处理一个string为另一个string的子串的情况 先dp求出最短长度 利用dp时保存的状态,标记出最优解的转移路线 然后dfs 求出字典序最小的解 dfs的时候 要同时判断长度, 因为可能沿原创 2015-05-30 22:11:22 · 723 阅读 · 0 评论