摘要: 官方题解:题意转化一下就是:给出一列数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,相减即为最长的连续的数的长度。i 要从1开始,不然会WA。#include #include #include #incl 阅读全文
posted @ 2013-08-07 21:32 冰鸮 阅读(219) 评论(0) 推荐(0)
摘要: 题意:给一些n,求出最小的只包含0,1的n的倍数设两数a, b满足: a #include #include #include using namespace std;const int MAXN = 20010;struct node{ int val; int pre;};int n;int ans[MAXN];node D[MAXN];void solved(){ memset( D, -1, sizeof(D) ); queue Q; Q.push(1); D[1].val = 1; D[1].pre = -1; while ( !Q.e... 阅读全文
posted @ 2013-08-07 20:25 冰鸮 阅读(393) 评论(0) 推荐(0)
摘要: 原文地址:http://blog.sina.com.cn/s/blog_6974c8b20100zc61.html作者:starszys“在一棵树上进行路径的修改、求极值、求和”乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的。我们需要用到一种貌似高级的复杂算法——树链剖分。树链,就是树上的路径。剖分,就是把路径分类为重链和轻链。记siz[v]表示以v为根的子树的节点数,dep[v]表示v的深度(根深度为1),top[v]表示v所在的重链的顶端节点,fa[v]表示v的父亲,son[v]表示与v在同一重链上的v的儿子节点(姑且称为重儿子),w[v]表示v与其父亲节点的连边(姑且称为 阅读全文
posted @ 2013-08-07 11:12 冰鸮 阅读(169) 评论(0) 推荐(0)