2012年8月27日
摘要: HDU_3681 由于Y和G加起来不到15个,那么可以预先将F、Y、G之间的最短路处理出来,然后化归成TSP问题来做。#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define MAXD 20int N, M, dis[MAXD][MAXD], g[MAXD][MAXD], mark, Y, G, sx, sy, vis[MAXD][MAXD];int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};char b[M 阅读全文
posted @ 2012-08-27 22:28 Staginner 阅读(453) 评论(0) 推荐(0) 编辑
摘要: HDU_2757 由于边权只有0和1,可以用稍加变形的BFS,也可以直接用优先级队列,由于后者省事一些,所以就直接用优先级队列来写了,不过当然效率也会低一些。#include<stdio.h>#include<string.h>#include<queue>#define MAXD 1010#define INF 0x3f3f3f3fchar b[MAXD];int N, M, dis[MAXD][MAXD], g[MAXD][MAXD], sx, sy, tx, ty;int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1}, dy[] 阅读全文
posted @ 2012-08-27 17:16 Staginner 阅读(196) 评论(0) 推荐(0) 编辑
摘要: HDU_2890 在罗穗骞的论文里有说过至少重复K次的可重叠的最长子串该怎么找,只不过这个题改成了不可重叠。我用的是比较暴力的办法,把按height值分组之后每组内sa[i]的值提取出来排个序,然后扫一遍看能不能形成至少K个不重叠的子串。 此外这个题有两个大坑:①题目中所谓的subsequence应该是substring,在HIT的OJ上这个题目的描述就都是用的substring;②所谓的字典序可能会带来歧义,比如结果有两种可能5100和599,如果将整数当成字符串来处理显然是5 100应该字典序更小,因为100的字典序比99小,但就这个题目而言应该是5 99的字典序比较小,也就是说要把每.. 阅读全文
posted @ 2012-08-27 15:10 Staginner 阅读(494) 评论(0) 推荐(0) 编辑
摘要: HDU_2704 由于N很小,离散化之后暴力对每块格子染色应该都能过。效率比较好的办法之一是用线段树+扫描线来做(当然也可以离散化,不过这个题目W、H比较小,所以可以不必离散化),在线段树上记录当前扫描线上当前区间被覆盖的次数cnt,扫描线上被覆盖的长度len,被覆盖的最大深度dep,以及被覆盖的深度最大的部分的长度ml就可以了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 210#define MAXD 40010int N, W, H, dep[4 * MAXD], 阅读全文
posted @ 2012-08-27 11:30 Staginner 阅读(238) 评论(0) 推荐(0) 编辑
摘要: HDU_1199 根据数据的范围感觉离散化之后暴力染色也是可以的,更好一点的办法就是用线段树优化染色操作,最后将所有的标记都下传到叶子节点之后,再顺序扫一遍各个区间就可以得到结果了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 4010#define INF 0x3f3f3f3fint N, tx[MAXD], to[4 * MAXD], X, color[4 * MAXD];struct List{ int x, y, c; }list[MAXD];void build 阅读全文
posted @ 2012-08-27 10:19 Staginner 阅读(262) 评论(0) 推荐(0) 编辑