首先,dp算出一个最大连续子段和
然后计算每个小朋友的分数,也就是ans[i]=max(ans[j]+sep[j])
由于ans的数组是单调增的,所以可以每个位置的值可以直接modp
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int n,p;
long long suf[maxn],sep[maxn],ans[maxn];
int main()
{
scanf("%d%d",&n,&p);
long long maxx=-1e14;
for(int i=1;i<=n;i++)
{
int x; scanf("%d",&x);
if(suf[i-1]>0) suf[i]=suf[i-1]+x;
else suf[i]=x;
maxx=max(maxx,suf[i]);
sep[i]=maxx%p;
}
ans[1]=sep[1];
maxx=-1e14;
long long print=ans[1];
for(int i=2;i<=n;i++)
{
maxx=max(maxx,ans[i-1]+sep[i-1]);
ans[i]=maxx;
if(print<maxx) print=maxx%p;
}
printf("%lld",print);
return 0;
}