题目描述

给定一个长度为N的数组a和M,求一个区间[l,r],使得$(\sum\limits_{i=l}^{r}{a_i})\ mod\ M$的值最大,求出这个值,注意这里的mod是数学上的mod(即-x mod M = (-x mod M + M) mod M)

输入

第一行两个整数N,M。
第二行N个整数a_i。

输出

输出一行,表示答案。

样例输入

5 13
10 9 5 -5 7

样例输出

11


题解

前缀和+STL-set

先用前缀和把一段区间变为前缀相减的形式,然后问题就转化为求$min((sum_i-sum_j)\ mod\ M)(j<i)$。

由于运算是在模意义下的,因此$sum_j$应该是$sum_i$的后继,使用set维护。如果没有后继,那么$sum_i$本身就是最大的以i结尾的区间和。

统计一下答案即可。

#include <set>
#include <cstdio>
using namespace std;
typedef long long ll;
set<ll> s;
set<ll>::iterator it;
int main()
{
int n , i;
ll m , sum = 0 , x , ans = 0;
scanf("%d%lld" , &n , &m);
s.insert(0);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%lld" , &x) , x = (x % m + m) % m , sum = (sum + x) % m;
it = s.upper_bound(sum);
if(it != s.end()) ans = max(ans , sum - *it + m);
else ans = max(ans , sum);
s.insert(sum);
}
printf("%lld\n" , ans);
return 0;
}

最新文章

  1. HDU 1848 SG函数博弈
  2. pointer to function
  3. iOS---------- @synchronized(self)的用法
  4. 收集的github的东西
  5. 与众不同 windows phone (48) - 8.0 其它: C# 调用 C++
  6. [cocos2d] 显示状态与文字
  7. MQ、JMS以及ActiveMQ
  8. Python Tutorial - Parse JSON Objects with Python
  9. [SinGuLaRiTy] 2017-03-27 综合性测试
  10. 新概念英语(1-137)A pleasant dream
  11. vue-render函数和插槽
  12. docker系列(1)- 配置
  13. vim的基础操作
  14. java IO流之详细总结
  15. [luogu4005]小Y和地铁【搜索+树状数组】
  16. 【Oracle】【6】去掉字符串最后一个特殊字符
  17. Redis在linux环境下的安装和部署
  18. Spring+SpringMVC+MyBatis整合基础篇(三)搭建步骤
  19. Memcached安装与配置
  20. ASP.NET 页面执行顺序详解

热门文章

  1. 如何在Mac上创建.txt文件
  2. SpringBoot学习记录(二)
  3. 零基础快速入门SpringBoot2.0教程 (二)
  4. 博学谷-数据分析numpy
  5. jqweui 中的tabbar导航
  6. 十二、MySQL 查询数据
  7. 第二章JavaScript 函数和对象
  8. c#用object将datatable快速填充excel后下载表格后打不开的问题
  9. 利用Django提供的ModelForm增删改数据
  10. Laravel — homestead 配置多站点