BZOJ 3544: [ONTAK2010]Creative Accounting( BST )
题意 : 一段序列 , 求一段子序列和取余 M 的最大值
其实是一道水题...
前缀和 , 然后就是找 ( sum( r ) - sum( l ) ) % M 的最大值 . 考虑一个 sum( r ) , 在 sum( k ) ( 1 <= k < r ) 中 :
sum( a ) > sum( r ) , sum( b ) < sum( r ) , sum( a ) 优于 sum( b )
sum( a ) > sum( b ) > sum( r ) , sum( b ) 优于 sum( a )
sum( r ) > sum( a ) > sum( b ) , sum( b ) 优于 sum( a )
那这样可以直接用 set 维护 , 每次对于一个前缀和 sum( x ) , 在 set 中二分 > sum( x ) 的第一个数 ( upper_bound ) , 假如没有就取 set 的最小值 , 更新answer , 再把 sum( x ) 插入到 set 中
( 一道水题被我写了这么多..果然我还是太弱了 5555 , 我也难得敲个这么长的题解.. )
--------------------------------------------------------------------------
--------------------------------------------------------------------------
3544: [ONTAK2010]Creative Accounting
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 352 Solved: 183
[Submit][Status][Discuss]
Description
给定一个长度为N的数组a和M,求一个区间[l,r],使得(\sum_{i=l}^{r}{a_i}) mod M的值最大,求出这个值,注意这里的mod是数学上的mod
Input
第一行两个整数N,M。
第二行N个整数a_i。
Output
输出一行,表示答案。
Sample Input
10 9 5 -5 7
Sample Output
HINT
【数据范围】
N<=200000,M,a_i<=10^18
Source