2012年2月23日
摘要: HDU_1874 终于找到了一个题目练了一下刚刚学习的用SG函数求解的方式,推荐一篇讲SG函数入门知识的博客:http://www.cnblogs.com/Knuth/archive/2009/09/05/1561007.html。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 1010int d[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024};int N, sg[MAXD];int dfs(int n){ int i, j 阅读全文
posted @ 2012-02-23 22:58 Staginner 阅读(265) 评论(0) 推荐(0) 编辑
摘要: HDU_2147 这个题目写得太悲剧了,本来我想找个简单点的题目实践一下刚接触的sg函数的,结果一开始没注意到空间的限制,开了二维的sg数组记忆化搜索结果就爆了空间了。 然后不得不换成了递推的模式继续写,而且还要用滚动数组优化内存,但写完交上去TLE了。 那没辙了,找规律吧,然后画了一下5*5的情况就找到规律了,然后直接O(1)求解过掉了。 囧,写到最后几乎跟sg一点关系都没了……继续找别的题目练习sg函数……#include<stdio.h>#include<string.h>int N, M;void solve(){ int ok; if(N & 1) o 阅读全文
posted @ 2012-02-23 22:36 Staginner 阅读(252) 评论(0) 推荐(0) 编辑
摘要: HDU_2489 由于N很小,可以枚举保留的顶点的情况并依次计算最小生成树,然后更新一下记录的结果即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 20#define MAXM 400int N, M, u[MAXM], v[MAXM], w[MAXM], vis[MAXD], r[MAXM], node[MAXD], p[MAXD], e, wa[MAXD], wb[MAXD], *a, *b, ew, nw;int cmp(const void *_p, const 阅读全文
posted @ 2012-02-23 11:51 Staginner 阅读(260) 评论(0) 推荐(0) 编辑
摘要: HDU_2492 由于N比较大,枚举两个队员并计算其中有多少个裁判是行不通的,不妨换一种思路去枚举裁判,这样对于任意一个裁判而言,不同的比赛场数等于左边小于裁判skill rank的人数乘以右边大于裁判skill rank的人数,再加上右边小于裁判skill rank的人数乘以左边大于裁判skill rank的人数。 在计算人数的时候,可以维护记录分别记录左右两边各个skill rank的人数的两棵线段树,每当枚举一个裁判时,先将裁判从右边的线段树删去,计算完之后再将裁判添加到左边的线段树中。#include<stdio.h>#include<string.h>#def 阅读全文
posted @ 2012-02-23 01:24 Staginner 阅读(335) 评论(0) 推荐(0) 编辑
摘要: HNU_10694 这个题目本质上就是去求模p的原根。 首先,我们用反证法证明这个结论:如果对于任意的正整数i,r^i%p包含了1~p-1所有整数的话,那么满足r^i%p=1这个等式的最小正整数为p-1。 如果上面的命题不成立,不妨设满足r^i %p=1这个等式的最小的正整数为j,假如j<p-1,那么对于任意r^i总能分解成若干r^j的与r^x(x<j)的积,所以r^i%p最多有x个不同的值,那么r^i%p不可能包含了1~p-1所有的整数。假如j>p-1,那么就说明当1<=x<=p-1时,不会出现a^x%p的值为1,那么就必然有x1、x2(1<=x1< 阅读全文
posted @ 2012-02-23 00:04 Staginner 阅读(367) 评论(0) 推荐(0) 编辑