2013年8月6日

hdu 4651 - Partition(五边形数定理)

摘要: 定理详见维基百科。。。。http://zh.wikipedia.org/wiki/%E4%BA%94%E9%82%8A%E5%BD%A2%E6%95%B8%E5%AE%9A%E7%90%86代码如下:#include #include #include #define LL long long #define INF 0x7fffffff #define MOD 1000000007 #define M 100005 using namespace std; int p[M]; LL ans[M]; void presolve() { int c = 0; for(i... 阅读全文
posted @ 2013-08-06 21:33 Primo... 阅读(193) 评论(0) 推荐(0) 编辑

hdu 4647 - Another Graph Game(思路题)

摘要: 摘自题解:若没有边权,则对点权从大到小排序即可。。考虑边,将边权拆成两半加到它所关联的两个点的点权中即可。。。因为当两个人分别选择不同的点时,这一权值将互相抵消。代码如下:#include #include #include #define LL long long #define INF 0x7fffffff #define M 100010 using namespace std; int comp(const double a, const double b) { return a=2; i-=2) ans+=node[i]-node[i-1]; ... 阅读全文
posted @ 2013-08-06 19:51 Primo... 阅读(95) 评论(0) 推荐(0) 编辑

hdu 4648 - Magic Pen 6(“水”题)

摘要: 摘自题解: 题意转化一下就是:给出一列数a[1]...a[n],求长度最长的一段连续的数,使得这些数的和能被M整除。分析:设这列数前i项和为s[i],则一段连续的数的和a[i]+a[i+1]+...+a[j-1]+a[j]=s[j]-s[i-1],所以这段连续的数的和能被m整除的条件就是(s[j]-s[i-1])%m==0,即s[j]%m-s[i-1]%m==0,因此,只需要每一个余数找使s[i]%m等于该余数的最小的i,和s[j]%m等于该余数的最大的j,相减即为最长的连续的数的长度。然后,可以预处理一下,用一数组存下模相同几个前缀和的最小坐标,使得代码优化为O(N)的时间复杂度。代码如下: 阅读全文
posted @ 2013-08-06 19:23 Primo... 阅读(161) 评论(0) 推荐(0) 编辑