题解:P1982 [NOIP2013 普及组] 小朋友的数字
solution
动态规划问题。
设
设
设
对于
这里要特判
结果会很大,并且没办法随时取模,所以要开 __int128。
code
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
long long n, p, a[N], q[N], t[N];
__int128 f[N], ans;
void out (__int128 x) {
if (x>9)
out(x/10);
putchar(x%10+'0');
}
int main () {
cin >> n >> p;
for (int i=1; i<=n; ++i)
cin >> a[i];
ans=f[1]=t[1]=q[1]=a[1];
for (int i=2; i<=n; ++i)
q[i]=max(q[i-1]+a[i], a[i]),
t[i]=max(t[i-1], q[i]),
f[i]=(i==2?2*f[1]:max(f[i-1], f[i-1]+t[i-1])),
ans=max(ans, f[i]);
if (ans<0)
cout << '-',
ans=-ans;
out(ans%p);
return 0;
}