关键词:前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 long
using 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);
}
}