算法竞赛
__Lingyue__
微软亚洲研究院 实习生
展开
-
n元一次不定方程 模板
1. 设方程a1x1 + a2x2 + a3x3 + a4x4 = c,所有系数的最大公因数应该整除c。2. 将方程转换为方程组递归求解,a1x1 + a2x2 = d2t2,d2t2 + a3x3 = d3t3,d3t3 + a4x4 = c.3. 逐级替换。原创 2016-08-16 13:32:18 · 2177 阅读 · 0 评论 -
数论 知识概念梳理
数论知识体系原创 2016-08-16 14:26:32 · 879 阅读 · 7 评论 -
排列组合模板
求排列组合数。原创 2016-08-16 15:04:04 · 1032 阅读 · 0 评论 -
组合数学 知识体系梳理
排列组合原创 2016-08-16 15:22:19 · 658 阅读 · 0 评论 -
快速排序 求第k大数
1. 快排利用标兵的思想,但每一次都是比较范围大小,没有精确排序。2. 同样适用于快速求解 需要定性的范围问题,例如:第k大(将前后定性大小,但不用排序).3. 求解第k大:通过判断下标,只计算有k的那一半。4. 快排是从广到窄的递归。5. 快排:a.枢轴要回归.b.i总是指向偏大的值.原创 2016-08-04 22:13:36 · 11330 阅读 · 0 评论 -
acm 算法竞赛 时间
含金量比较高的几类算法竞赛的时间统计原创 2016-04-16 20:16:24 · 14738 阅读 · 0 评论 -
codeBlock 必备快捷键
常用到的一些快捷键原创 2016-04-16 22:08:19 · 4186 阅读 · 0 评论 -
运算符重载
1. 运算符重载在类内。2. 要使用常量参数。3. 构造函数的常见写法。原创 2016-08-04 21:53:36 · 331 阅读 · 0 评论 -
奖学金 灵活的拓扑排序
1. 对先遍历后处理要理解的深刻。2. 从下往上遍历通过传参数改变父节点的值。3. 利用vector存图可以大大减少空间和时间的开销。原创 2016-08-04 22:36:08 · 1410 阅读 · 0 评论 -
哈希处理字符串
1. 常用哈希函数,seed=131,初始化阶数组,方便等阶后比较,初始化字符串,比较时只需要看差值。2. 逆向初始化字符串,使当前元素在差值中。原创 2016-08-04 22:38:40 · 708 阅读 · 0 评论 -
国家集训队论文集
国家集训队曾经发表过的论文总结原创 2016-08-04 22:39:30 · 6403 阅读 · 1 评论 -
O(n)级排序
1. 计数排序,桶排序,基数排序。2. 没有利用比较排序,利用了映射的思想,达到了线性复杂度。3. 字符串等长度不定的情况应该用比较排序sort(),比较整数时,数据量大时:元素差值小,用计数,差值大分布均匀,用桶排序,通常情况下都可以使用基数排序,速度比桶排序略慢但仍然是常数级别。原创 2016-08-04 22:47:21 · 4604 阅读 · 0 评论 -
八大基础算法 自己的通俗理解
一些基础算法的理解,包括模拟法的理解。原创 2016-08-05 00:05:52 · 3817 阅读 · 0 评论 -
uva10562 Undraw-the-Trees 字符题处理 递归
字符串函数的应用,递归处理复杂的字符题原创 2016-08-05 00:47:51 · 444 阅读 · 0 评论 -
uva10570 外星人聚会 环状序列
环状序列通常有两种方法:1. 延长二倍序列,利用线性模拟环。2. 利用取余改变下标。原创 2016-08-05 00:46:27 · 926 阅读 · 0 评论 -
uva10817 校长的烦恼 利用-ans
1. 利用int& ans保存当前状态,因为他不会随着下标的改变而改变,防止下表改变而出现的bug。2. 增加维度来解决状态的表示,找明白状态,决策,状态转换。3. 通过记忆化来枚举所有可以完成规定任务的代价看哪个少,通过赋值INF 和 0 来方便比较。原创 2016-08-05 00:45:19 · 425 阅读 · 0 评论 -
uva11212 编辑书稿 迭代加深
1. 迭代加深,逐层计算。2. 乐观估价函数,剪枝。3. 递归枚举,利用数组保存数据,之后恢复。4. 剪切一个片段并粘贴,最多改变3个后缀。5. 迭代加深的基本框架。原创 2016-08-05 00:44:17 · 548 阅读 · 0 评论 -
uva11584 划分成回文串 线性dp
1. 状态转移时,常常需要遍历之前的每一种情况来看哪一种情况是最优,比如跳过哪一个串。2. 判断回文串可以从中心位置开始遍历,预处理往往会加快时间。原创 2016-08-05 00:38:25 · 443 阅读 · 0 评论 -
uva11853 图 范围节点的处理和遍历
如果这个节点有一定范围半径:1. 那么通过圆心距判断是否相交。2. 通过判断圆和边界来判断是否出界。3. 相交的圆进行遍历。原创 2016-08-05 00:35:32 · 972 阅读 · 0 评论 -
hdu1005 超规模>>找规律>>有限次数循环
超规模>>算法优化 >>找规律>>规律变化 >>有限次数内循环>>找到变化范围原创 2016-04-17 16:48:44 · 5724 阅读 · 0 评论 -
中序-先序 中序-后序 构造树
1. 后序中序构造树2. 先序中序构造树3. 字符树使用map做映射原创 2016-08-04 21:42:20 · 421 阅读 · 0 评论 -
uva10003 切木棍 线性区间dp
1. 线性dp,区间思想。2. 动态转移方程:区间代价+此次的代价。3. 下标i,j指的是切割点而不是每一个点。4. 此次代价在底层可以直接返回结果。5. 利用了标准的记忆化搜索模板,如果存在则返回。原创 2016-08-05 00:58:05 · 1147 阅读 · 0 评论 -
uva1626 括号序列
1. 状态转移可以分情况讨论,注意特殊情况。2. 利用j-i递推,利用了递推模板,边界需要处理的提前初始化。3. scanf不读入\n等符号,如果要读入空串需要用fgets或者getchar。4. 递推时,i递减,j从i开始递增,取k做中间标,保证了按照j-i的规律递增,每一次的值都可以利用上一次的值。原创 2016-08-05 00:59:19 · 873 阅读 · 0 评论 -
uva1625 颜色的长度
1. 另一个递推模板,遍历完上一层,然后下一层就可以利用i-1或者j-1.2. 两个队列的类似最长公共子序列问题常定义状态为,分别移动了多少个元素。3. 复杂代价预处理,然后状态转换时直接调用。4. 滚动数组可以利用多层来表示相邻层次关系,利用t^=1 来进行0和1的状态转换。原创 2016-08-05 01:00:19 · 811 阅读 · 0 评论 -
uva11882 最大的数 bfs 遍历估价剪枝
1. 剪枝:利用bfs低复杂度遍历估价和最优解比较,剪枝后避免枚举子集造成的高复杂度时间浪费。2. 利用多次排序从大数开始遍历,或者利用优先队列。3. dfs+bfs剪枝。原创 2016-08-05 00:34:48 · 553 阅读 · 0 评论 -
uva12166 修改天平 元素的贡献值-最优解
按元素的贡献值求最值的思想原创 2016-08-05 00:32:00 · 674 阅读 · 0 评论 -
uva12171 sculpture 离散化 3维bfs求面积体积
1. 离散化。2. 状态数组是关键。3. 求面积利用投影和6个方向就可以解决。原创 2016-08-05 00:28:29 · 1579 阅读 · 0 评论 -
百炼 Zipper 剪枝
1. 写代码前一定要写好架构和一些细节。2. 利用变量保存字符串的ascii码值之和进行可行性剪枝。3. 若两字符串中所含各字母个数相同,则ascii值之和相同,反之不然,但大部分都是,可以剪枝。原创 2016-08-05 00:08:34 · 476 阅读 · 0 评论 -
百度之星 大搬家 递推
1. 递推。2. 找到和前某项的关系,比如进行某种组合或者配合。原创 2016-08-05 00:08:18 · 6123 阅读 · 0 评论 -
uva12716 GCD等于XOR 筛法枚举
1. 注意题目的相关性质。例如aXORb = c 则 a XOR c = b;2. 筛法的时间复杂度是nlgn;3. 数论的题目可以最后打印解找规律,降低复杂度。4. k*10^8的复杂度可以接受。5. 若gcd(a,b) == a XOR b,则gcd(a,b) == a-b == a XOR b;原创 2016-08-05 00:05:26 · 708 阅读 · 0 评论 -
归并排序 求逆序数
1. 利用临时数组合并。2. 当只关心一个整体的解时,可以将其内部排序,方便计算。3. 利用归并的思路恰好求出了逆序数。4. 归并思路:从两个部分从小到大的提取数到临时数组中。原创 2016-08-04 22:40:19 · 4333 阅读 · 0 评论 -
算法复杂度 数据规模
n! 82^n 20n^3 300n^2 10^4nlog2n 10^6n 10^8原创 2016-08-04 22:07:52 · 865 阅读 · 0 评论 -
[转]ACM-ICPC 竞赛 算法类型
竞赛包含的算法有哪些转载 2016-04-19 16:40:43 · 1520 阅读 · 0 评论 -
poj2528 贴海报 区间树离散化
1. 利用离散化大大优化速度。2. 离散化:排序,去重,映射。3. 区间树:判断区间,上下更新值。原创 2016-08-06 11:54:04 · 653 阅读 · 0 评论 -
uva208 剪枝 连通块儿的判定
1. 图不一定是连通的,某些题型下要提前进行判断,进行剪枝。2. 递归遍历标记同一个连通块儿。3. 从结果遍历判断和结果在同一个连通块儿的子集。4. 子集遍历:核心在于递归前的cursor的++,和递归后cursor的--。原创 2016-08-06 11:54:36 · 559 阅读 · 0 评论 -
uva437 DAG最长路 节点映射间接表达
1. DAG最长路的模板记忆化搜索。2. 当图节点是结构体时,利用结构体数组的下标映射到图中。原创 2016-08-06 11:54:46 · 518 阅读 · 0 评论 -
uva572 油田 连通块遍历
代码的简洁性需要注意小技巧:1. 方向数组。2. 外面包一层空气防止判断边界。3. 更改原来的数组的状态而不需要重新建立vis数组(这样会破坏原始数据,是一个不好的习惯,但是这样很灵活。)原创 2016-08-06 11:55:07 · 828 阅读 · 0 评论 -
UVA1025 固定终点二维dp
1. 状态,决策,转换。2. 遍历每一个状态并记忆化搜索。3. 复杂度为 状态*决策。4. 递推过程找好大层次,比如这道题的时间,可以利用上一层的结果。5. 固定终点问题常以到终点的值为主状态。原创 2016-08-06 11:55:30 · 454 阅读 · 0 评论 -
uva1252 20个问题
1. 遇到集合个数太多的情况想办法转换表达方式,再用数组存储,相当于用状态做一个映射。2. 需要得到第几个的时候就不太好s++这样枚举,适合多次枚举第几个数,再判断是否曾经枚举过。3. 分阶段的思想运用时如果需要利用阶段的状态,则更适合利用二进制枚举状态,以方便状态的表示,递归i>>i+1这种不方便表示。4. 根据题意注意题目中什么时候要用max,什么时候要用min。5. 多次枚举每一位可以得到结果,原创 2016-08-06 11:55:35 · 1312 阅读 · 0 评论 -
uva1343 旋转游戏
1. 迭代加深```if(d+h() > maxd)//若true,则表示d次数太大,已经无法满足最少h()次的要求。 return false;```2. 利用两个数组,一个连续数组存值,另一个数组标识位置。3. 剪枝:状态合并,分类讨论。 分解目标个数,分别求解,使得过程中的状态得以合并。过程中状态复杂度往往不是线性,目标个数分解是线性,所以效率得以大幅度提升。原创 2016-08-06 11:55:48 · 471 阅读 · 0 评论