上一页 1 ··· 15 16 17 18 19 20 21 22 23 ··· 85 下一页
  2012年7月22日
摘要: SPOJ_4565 一开始本来打算先把线拓宽,当成方格来看待,然后模拟行走过程并对格子染色,最后用种子填充的方式扫描一下有多少封闭的块。但后来发现best solution基本都是0.00s的,于是便开始找规律,猛然发现原来交点的个数就是封闭正方形的个数……#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 1010using namespace std;int N;char b[MAXD], *op = "UDLR";int dx[] = {-1, 1, 阅读全文
posted @ 2012-07-22 15:59 Staginner 阅读(179) 评论(0) 推荐(0) 编辑
  2012年7月20日
摘要: 可以用f[i][j]表示递推到前i位时最后一段的和是j的情况种数,然后进行dp即可。#include<stdio.h>#include<string.h>#define MAXD 30#define MAXS 250int N, S, A[MAXD], f[MAXD][MAXS];char b[MAXD];void init(){ int i; N = strlen(b + 1); S = N * 9; A[0] = 0; for(i = 1; i <= N; i ++) A[i] = A[i - 1] + b[i] - '0';}void sol 阅读全文
posted @ 2012-07-20 08:51 Staginner 阅读(338) 评论(0) 推荐(0) 编辑
  2012年7月19日
摘要: SPOJ_4560 这个题目相当于将两个串个各分成了数量相等若干段,如果将对应的两小段看成一组,那么每组只能选其一累加,求最后的和最大是多少。因此可以用两个指针指向这两个数组,初始时两个指针都位于最左边,然后遍历这两个数组,如果某个指针指向的值较小,那么就累加这个这个值并使指针位置加1,当出现两个指针所指的值相等时,就说明遍历完成了一组,选择其中较大的累加即可。#include<stdio.h>#include<string.h>#define MAXD 10010int N, M, a[MAXD], b[MAXD], suma, sumb;void init(){ i 阅读全文
posted @ 2012-07-19 18:04 Staginner 阅读(333) 评论(0) 推荐(0) 编辑
摘要: 一开始反应的是用状态压缩dp来做,后来一看步数很小,只有三步,于是直接暴力就可以了。另外由于测试数据比较多,可以先从最终状态BFS一遍,保留下所有结果,然后每次判断就是O(1)的了。#include<stdio.h>#include<string.h>#define MAXD 20#define MAXM 160#define MAXS 100010#define INF 0x3f3f3f3fint first[MAXD], e, dis[MAXS], next[MAXM], v[MAXM];int q[MAXS];const int ini = (1 << 阅读全文
posted @ 2012-07-19 16:26 Staginner 阅读(365) 评论(0) 推荐(0) 编辑
  2012年7月18日
摘要: SPOJ_1873 这个题目的子问题实际上是SGU_114一类的题目(http://www.cnblogs.com/staginner/archive/2012/01/11/2319989.html)。 首先可以把题意转化为每次可以将一个或一堆连在一起的方块向左移一个位置或者向右移一个位置,最后的代价就是各个方块移动的长度之和。可以证明,最优解中,每个方块应该都是向着某个点移动的,不会说先左移移再右移移之类的,那样一定不如一开始就向着一个方向移划得来。 这样根据移动的方向不同,那么这个环就可以等价成一条链,只不过现在还不明白从哪里断开。 不过不妨先加假设成现在已经断成了一条链,那么这些... 阅读全文
posted @ 2012-07-18 00:02 Staginner 阅读(174) 评论(0) 推荐(0) 编辑
  2012年7月11日
摘要: URAL_1806 这个题目思路比较明显,将边的关系找出来之后做最短路即可,但是由于N巨大,直接判断两个字符串能否转化是划不来的。 于是不妨将所有字符串放到哈希表中,然后对于当前字符串,枚举这个字符串改变一位、交换两位的情况,然后看能否在哈希表中找到变化之后的字符串,这样对于每个字符串至多枚举200种情况,复杂度还是可以接受的。#include<stdio.h>#include<string.h>#define MAXD 50010#define HASH 1000003#define INF 0x3f3f3f3fint N, D, cost[15], head[HAS 阅读全文
posted @ 2012-07-11 16:52 Staginner 阅读(404) 评论(0) 推荐(0) 编辑
  2012年7月9日
摘要: POJ_3657 题目的大意是给出若干个条件x y A,表示区间[x,y]中最小整数为A,而且所有整数都是各不相同的,问到第几个条件的时候就会出现矛盾。 细想一下后会发现,实际上我们只要能把每个[x,y]的最小值A放好就一定可以构造出一组解,剩下的值可以直接放INF、INF+1之类的东西就可以了。那么我们就可以得到无解的情况,就是对于某个A,发现其不能放在任何一个位置。 对于任意一个条件x y A,实际上我们可以得到一条信息,就是区间[x,y]内所有整数都大于或等于A。这样满足完所有条件之后,就会得到任意一个数的取值范围。那么接下来就要考虑所有的最小值A是否都可以放到某个位置。这时要考虑... 阅读全文
posted @ 2012-07-09 13:05 Staginner 阅读(673) 评论(0) 推荐(0) 编辑
  2012年7月4日
摘要: POJ_1741 具体的思路可以参考漆子超的《分治算法在树的路径问题中的应用》这篇论文。 对于树的分治的题目,一开始理解起来有点头疼,主要是一开始没弄明白为什么分治以后可以改善复杂度,其实关键的操作就在于对于当前这棵树,重新找到一个“合适”(何为“合适”,详见论文)的点作为根节点,并将这个点删除,再依次递归这个点的各个子树。 如果我们将这些点按删除的顺序重新构造一棵树的话,论文上有证明这棵树的树高是O(logN)的,对于每一层的节点而言,遍历一遍这层节点所有的子树的总复杂度为O(N)。这样,对于这棵树每个节点都执行一遍遍历所有子树的操作的总的复杂度就是O(NlogN)了,从而达到了降低复杂.. 阅读全文
posted @ 2012-07-04 19:24 Staginner 阅读(1095) 评论(0) 推荐(0) 编辑
  2012年7月3日
摘要: SPOJ_2157 其实由于解只有一组,可以将machula所在的数看成一整个未知数而不是只将machula看成未知数,这样就可以方便得转化成一个A+B或者A-B的问题了。#include<stdio.h>#include<string.h>#include<ctype.h>#define MAXD 110int right, ans, rn;char a[MAXD], b[MAXD], c[MAXD];bool machula(char *str){ int i; for(i = 0; str[i]; i ++) if(isalpha(str[i])) . 阅读全文
posted @ 2012-07-03 00:37 Staginner 阅读(256) 评论(0) 推荐(0) 编辑
  2012年6月17日
摘要: HDU_1512 这个题目用左偏树做的居多,昨天晚上突然想到其实用一棵splay也能方便的实现合并的操作,于是就用splay写了。 在fight之前,要先找到两棵树中的最大值,然后splay到根部并修改。之后为了实现合并,可以将一棵splay“最右边”的元素splay到根部,这样根的右子树就为空了,直接把另一棵树放到这个位置即可。#include<stdio.h>#include<string.h>#define MAXD 100010#define INF 0x7fffffffint N;struct Splay{ int pre, ls, rs, key, max; 阅读全文
posted @ 2012-06-17 11:34 Staginner 阅读(368) 评论(0) 推荐(0) 编辑
上一页 1 ··· 15 16 17 18 19 20 21 22 23 ··· 85 下一页