- 博客(11)
- 收藏
- 关注
原创 UVA live 3938 - "Ray, Pass me the dishes!"(线段树)
题目链接:点击打开链接该题需要深刻理解线段树的特点:任意一个父结点所表示的区间都是两个儿子区间的并, 且儿子区间的交为空集。那么我们可以采用分治的思想: 一段区间的最大连续和要么来自左半边, 要么来自右半边, 或者一半在左一半在右。细节参见代码:#include#include#include#include#include#include#include#inclu
2016-08-27 18:23:27 700
原创 SGU 507 Treediff(平衡树)
题目链接:点击打开链接思路:我们要求叶子结点的值相差最小, 那么这是一个大小关系, 我们可以维护一棵平衡树, 这样, 对于每一个数, 和他相差最小的情况只能是他相邻左边或右边。但是如果开n棵平衡树, 复杂度高达n^2logn,还不如n^2暴力来的快。 我们可以采用一种叫做: 启发式合并 的技巧。 每次将一棵比较小的树合并到一棵比较大的树上。 使得复杂度达到nlogn, 证明也很简单:考
2016-08-23 21:09:28 945
原创 UVAlive 6697 - Homework Evaluation(DP)
题目链接:点击打开链接思路:用d[i][j][last][p]表示第一个串到了i位置, 第二个串到了j位置,上一个操作是last操作, 是否开始匹配的最优解。该题有坑的, 比赛时多亏队友的提示: 当第一个串匹配完毕, 第二个串剩下的部分要当作减去了。细节参见代码:#include #include #include #include #include #includ
2016-08-23 20:54:33 633
原创 HDU 5855 Less Time, More profit(最大权闭合子图)
题目链接:点击打开链接思路:最大权闭合子图的裸题, 给个学习资料:点击打开链接当结点即有正权值又有负数权值时, 怎么求任意闭合子图的最大和呢? 只要求出最小割E, 用总的正数权值TOT 减去E就是答案。细节参见代码:#include#include#include#include#include#include#include#include#include
2016-08-17 21:06:00 864
原创 HDU 5828 Rikka with Sequence(线段树)
题目链接:点击打开链接思路:对于该题, 由于存在区间加一个值, 那么所有数都可能永远不会变成1, 但是数与数之间的相对值会趋近于相等。 比如1 2 3 4 5, 进行一次根号操作变成1 1 1 2 2, 而一旦如果相等, 那么他们同时加一个数也是相等的。 所以我们增加一个标记bit[rt]表示该区间内的数是否全部相等,如果相等等于什么。细节参见代码:#include #inc
2016-08-11 20:39:37 1092 4
原创 Ural 1028. Stars(树状数组)
题目链接:点击打开链接思路:为了满足第一个条件, 我们可以先按照x坐标排序, 然后我们用树状数组来维护y坐标大小关系, 就可以在O(nlogn)的时间内求出答案了。细节参见代码:#include #include #include #include #include #include #include #include #include #include #i
2016-08-10 20:43:13 869
原创 HDU 5818 Joint Stacks(左偏树)
题目链接:点击打开链接思路:该题的关键是怎么把两个栈合并, 我们可以使用一种叫左偏树的数据结构, 满足堆的性质和集合的性质,支持在O(logn)的复杂度下进行删除堆顶元素, 插入一个元素,合并两个堆。细节参见代码:#include using namespace std;typedef pair P;const int maxn = 152400;P v[maxn];in
2016-08-10 19:57:23 942 2
原创 HDU 4455 Substrings(DP)
题目链接:点击打开链接思路:我们用d[i]表示长度为i的答案。 那么我们可以把样例数据写出来看看是否能够递推。 可以发现, d[i] = d[i-1] - last[i-1] + (n-i+1) - dist[i]。last[i]表示从后往前i长度时不同数字的个数, 也就是说, d[i-1]的最后一个子序列被扔了, 然后d[i]比d[i-1]还可能多加了( n - i + 1)
2016-08-08 20:24:20 659
原创 HDU 3237 Help Bubu(DP)
题目链接:点击打开链接思路:比赛时查一点出, 需要加一个优化才能防止超时(恶心), 状态很容易想到: d[i][j][s][k]表示前i本书拿了j本没拿的书的集合是s没拿的书的最后一本是k的最优解。为什么状态压缩的是目前桌子上的书的集合呢? 因为我们要防止一种情况:那就是如果对于高度为H的一种书, 我们都拿走了, 那么还要放回桌子上, 最优解要+1, 这样表示之后, 我们只要判断一下
2016-08-05 21:59:52 872
原创 HDU 3689 Infinite monkey theorem(KMP + DP)
题目链接:点击打开链接思路:用d[i][j]表示前i个字符,已经匹配了字母中的j个字符,最终包含这个字母的概率。每次转移的时候有n个方向, 表示第i个字符选哪个字符, 那么有个问题, 如果我当前选的这个字符失配了, 那么转移之后我还匹配了多少个字符。 这恰恰是KMP能做的。细节参见代码:#include #include #include #include #inclu
2016-08-03 20:02:09 646
原创 HDU 5787 K-wolf Number(数位DP)
题目链接:点击打开链接思路:我们用dp[cur][a][b][c][d][p]表示当前到了第cur位,前四位分别是abcd并且当前是否已经小于给定的数的方案数。 我们分别算出L和R的dp值, 以及L是否符合要求, 做差并把多减的加上即可。 比赛时写的比较恶心, 不是很美观但是很直观。细节参见代码:#include #include #include #include
2016-08-02 20:41:42 1492
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人