RT,int,long long, __int128 都只有10分,感觉是取模的问题
a[i]
:第 i 个小朋友手上的数字
u[i]
:前 i 个数以 a[i]
结尾的最大子段和
v[i]
:前 i 个数的最大子段和(特征值)
m[i]
:第 i 个小朋友的分数
P
:分数最高的小朋友的位置
MaxM
:目前分数+特征值的最大值
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
using namespace std;
__int128 n,p,a[1000010],u[1000010],v[1000010],m[1000010],MaxM,P = 1;
inline __int128 read(){
int X=0,w=0; char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
inline void print(__int128 x){
if(x<0){putchar('-');x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
}
int main(){
n = read();
p = read();
a[1] = read();
u[1] = a[1],v[1] = a[1],m[1] = v[1];
MaxM = m[1]+v[1];
for(__int128 i = 2; i <= n; i++){
a[i] = read();
u[i] = max(a[i],u[i-1]+a[i]);
v[i] = max(v[i-1],u[i]);
m[i] = MaxM;
if(m[i]>m[P]) P = i;
if(m[i]>=0) m[i]%=p;//取模
else m[i] = 0-((0-m[i])%p);
MaxM = max(MaxM,m[i]+v[i]);
}
print(m[P]);
return 0;
}