hakerrank <Maximise Sum> set

来源:互联网 发布:n86软件 编辑:程序博客网 时间:2024/05/19 23:03

关键词:前i-1个数中大于a[i]的最小值

题意:n个数,求模m的最大子序列(连续)和 

已知n和m

做法:1.预处理sum[i]=sum[i]%m(>0)

以第i个元素结尾的模m最大子序列和=max{sum[i],((sum[i]-x)%m+m)%m},x是前i-1个数大于sum[i]的最小值

如何维护前i-1个数种大于a[i]的最小值?——set


#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<vector>#include<queue>#include<map>#include<set>#define INF 0x3f3f3f3f#define ll long longusing namespace std;const int maxn = 100000+10;int t,n;ll m;ll a[maxn],sum[maxn],ans;set<ll> s;int main(){    //freopen("a.txt","r",stdin);    scanf("%d",&t);    while(t--){        scanf("%d%lld",&n,&m);        sum[0]=0;        for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); sum[i]=(a[i]+sum[i-1])%m; }        s.clear();        ans=0;        for(int i=1;i<=n;i++){            ll l=*s.upper_bound(sum[i]);            ll tmp1=((sum[i]-l)%m+m)%m;            ll tmp=max(tmp1,sum[i]);            ans=max(tmp,ans);            s.insert(sum[i]);        }        printf("%lld\n",ans);    }}




0 0
原创粉丝点击