题解:
最大字段和类似于DP,判断加上本次的数是否划算,另外用一个MAXN保存目前最大的字段和
如果加上本次的数不划算的话就将特征值赋为之前的最大字段和。对于分数,我们可以发现
分数总是一个不下降序列,因此,如果上一个的特征是小于0的,那么加上他就不划算,反之
则划算,加上它,最后我们就能得到一个不下降序列。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<cctype>
#include<cmath>
#include<map>
#include<climits>
#define MAXA 1000005
#define MIN -1500000000
using namespace std;
typedef long long LL;
bool isFirst;
LL n,MOD;
LL temp[MAXA],Tezheng[MAXA],Fenshu[MAXA],hand[MAXA],MAXN;
int main() {
scanf("%lld %lld",&n,&MOD);
for(int i=1;i<=n;i++)
scanf("%lld",&hand[i]);
temp[1] = Tezheng[1] = MAXN = hand[1];
for(int i=2;i<=n;i++) {
temp[i] = max(temp[i-1] + hand[i],hand[i]);
Tezheng[i] = max(MAXN,temp[i]);
MAXN = Tezheng[i];
}
Fenshu[1] = Tezheng[1];
Fenshu[2] = Tezheng[1] + Fenshu[1];
MAXN = Fenshu[2];
isFirst = Fenshu[1] <= Fenshu[2] ? false : true;
for(int i=3;i<=n;i++) {
if(Tezheng[i-1] > 0) {
Fenshu[i] = Fenshu[i-1] + Tezheng[i-1];
isFirst = Fenshu[i] > Fenshu[1] ? false : true;
if(Fenshu[i] > 10000000000)
Fenshu[i] %= MOD;
}
else
Fenshu[i] = Fenshu[2];
}
if(isFirst)
printf("%lld",Fenshu[1] % MOD);
else
printf("%lld",Fenshu[n] % MOD);
}