BZOJ 3544 ONTAK2010 Creative Accounting 平衡树

来源:互联网 发布:列主元三角分解法C语言 编辑:程序博客网 时间:2024/06/03 14:23

题目大意:给定一个序列,求一个区间之和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 200200using 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;}


1 0
原创粉丝点击