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)的时间复杂度。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
#define INF 0x7fffffff
#define M 100010 using namespace std; int p[M];
LL sum[M];
int main ()
{
int n, m;
LL x;
while(~scanf("%d %d",&n, &m))
{
for(int i = 0; i < m; ++i)
p[i] = INF;
for(int i = 1; i <= n; ++i)
{
scanf("%I64d", &x);
sum[i] = sum[i-1]+x;
int d;
if(sum[i]<=0)
{
d = sum[i]/m;
sum[i]+=m*(-d+1);
}
sum[i]%=m; p[sum[i]] = min(i,p[sum[i]]);
}
int ans = 0;
for(int i = 1; i <= n; ++i)
{
if(sum[i]==0)
ans = max(ans, i);
else
{
int t = i-p[sum[i]];
ans = max(ans, t);
}
}
printf("%d\n",ans);
}
return 0;
}
hdu 4648 - Magic Pen 6(“水”题)的更多相关文章
- HDU 4648 Magic Pen 6 (。。。。。。。。。。)
Magic Pen 6 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- HDU 4648 Magic Pen 6
题目链接 6Y什么水平.. #include <cstdio> #include <cstring> #include <string> #include < ...
- HDU 4648 Magic Pen 6 思路
官方题解: 题意转化一下就是: 给出一列数a[1]...a[n],求长度最长的一段连续的数,使得这些数的和能被M整除. 分析: 设这列数前i项和为s[i], 则一段连续的数的和 a[i]+a[i+1] ...
- HDU 5578 Friendship of Frog 水题
Friendship of Frog Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.ph ...
- HDU 5590 ZYB's Biology 水题
ZYB's Biology Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid ...
- HDU 5538 L - House Building 水题
L - House Building Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.ph ...
- hdu 1005:Number Sequence(水题)
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- hdu 1018:Big Number(水题)
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- hdu 2041:超级楼梯(水题,递归)
超级楼梯 Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Su ...
随机推荐
- Windows资源管理器 已停止工作
解决方案:http://jingyan.baidu.com/article/5225f26b6aa830e6fa0908a8.html
- js复制input 框中的值
function copy(){ var Url2=document.getElementById("copyValue"); Url2.select(); document.ex ...
- php六种基础算法:冒泡,选择,插入,快速,归并和希尔排序法
$arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法 * 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来. * 比 ...
- [转]分享一个用Telnet代替JLinkRTTClient的办法,实现同时显示和记录
原帖子http://www.amobbs.com/thread-5614514-1-1.html Jlink 驱动 升级到4.96后,提供了一个 JLinkRTTViewer,确实方便了很多,但似乎不 ...
- jstl <c:forEach> 介绍
varStatus是<c:forEach>jstl循环标签的一个属性,varStatus属性.就拿varStatus="status"来说,事实上定义了一个status ...
- 通过微信企业号发送zabbix报警
采用微信报警时,管理员账户中必须要设置"示警媒体"一项,"收件人"一项可随便填写一下.其它成员则可以不用添加设置. ---------------------- ...
- ecshop的弊病和需要修改的地方,持续更新
ecshop的session机制是基于cookie的,用数据库进行缓存,当浏览器关闭cookie,sessions表会爆表,所以需要改进. 在cls_template.php中 $_echash值是固 ...
- flex4.0密钥及破解方式
输入下面的序列号: 1424-4507-0757-7016-8907-6937 1424-4785-4428-8084-6314-8733 1424-4794-9281-8063-2338-9079 ...
- C++中四种转换类型的区别
一.四种转换类型比较: 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可 ...
- iOS应用之微信支付集成-直接前端集成
所有信息的生成都在前端完成,包括对订单进行sign签名以及MD5签名加密(此方法相对来说有些复杂,没有官方给的方法简单).注:官方给的是v3&v4支付流程,签名和加密都是在服务器端进行,由于没 ...