http://tyvj.cn/p/3074
真坑的题目。。核心是求最大子段和,DP搞定
“其它小朋友的分数为排在他前面的所有小朋友中(不包括他本人),小朋友分数加上其特征值的最大值。”
原来前面可以分别找出两个小朋友,一个特征值的最大,一个分数最大
最后两个点还超long long。。
加了取模又莫名WA两个点。。
然后弄了个特判,AC了。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1000000 + 2;
long long a[maxn];//举数
long long f[maxn];//特征值
int main ()
{
int n,p;
scanf("%d%d", &n, &p);
long long maxh;//前最大特征
long long maxr;//前最大特征值
long long maxf;//前最大分数+特征值
long long ans; //前最大分数
f[0] = -10000000000;
bool ghost = false;
for (int i=1;i<=n;i++)
{
scanf("%lld", &a[i]);
f[i] = max(f[i-1]+a[i], a[i]);
maxr = (i==1) ? (f[i]) :(max(f[i], maxr));
if (ghost) ans = (i==1) ? (f[i]) : maxf;
else ans = (i==1) ? (f[i]) : max(maxf,ans);
if (ans>1000000000) {ans %= p; ghost = true;}
if (ghost) maxf = (i==1) ? (ans+maxr) : maxf+maxr;
else maxf = (i==1) ? (ans+maxr) : max(maxf, maxf+maxr);
if (maxf>1000000000) {maxf %= p;ghost = true;}
}
printf("%lld\n", ans%p);
return 0;
}