博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj3544】[ONTAK2010]Creative Accounting 前缀和+STL-set
阅读量:4973 次
发布时间:2019-06-12

本文共 933 字,大约阅读时间需要 3 分钟。

题目描述

给定一个长度为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 
#include
using namespace std;typedef long long ll;set
s;set
::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;}

 

 

转载于:https://www.cnblogs.com/GXZlegend/p/7434646.html

你可能感兴趣的文章
set集合
查看>>
SSH
查看>>
IOS 网络浅析-(六 网络图片获取之三方SDWebImage)
查看>>
Zookeeper 安装
查看>>
python self
查看>>
redis 重启
查看>>
EBS R12 查询EBS用户相关SQL
查看>>
推荐阅读
查看>>
微信支付
查看>>
fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
查看>>
XCTF-upload
查看>>
三步学会解决VS生成配置问题
查看>>
AtCoder Beginner Contest 121 题解
查看>>
Redis热点问题发现及通用解决方案
查看>>
Android之网络开发详解
查看>>
*Bash:如何用bash 转义 URL里的特殊字符,让其在sed不会产生歧义?
查看>>
IT笔面试题
查看>>
[CTSC2012]熟悉的文章 后缀自动机
查看>>
纯手工打造[博客园-博文数据分析]及技术分享(java)
查看>>
POJ 1961 KMP
查看>>