题目大意:给定一个序列,求一个区间之和mod m的值最大
维护一个前缀和,每次利用set寻找第一个比当前值大的数,如果找不到就去找整个set中最小的数,然后将当前前缀和加入set
注意set中upper_bound的写法
upper_bound(s.begin(),s.end(),a[i])是O(n)的
s.upper_bound(a[i])才是O(logn)的
好坑。。。。。
#include <set>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 200200
using namespace std;
int n;
long long a[M],m,ans;
set<long long> s;
int main()
{
int i;
cin>>n>>m;
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
((a[i]%=m)+=m)%=m;
(a[i]+=a[i-1])%=m;
}
s.insert(0);
for(i=1;i<=n;i++)
{
set<long long>::iterator it=s.upper_bound(a[i]);
if(it==s.end()) it=s.begin();
ans=max(ans,(a[i]-(*it)+m)%m);
s.insert(a[i]);
}
cout<<ans<<endl;
return 0;
}