思路:

首先我们知道最大连续子序列的和的dp方程是:.
这题要我们求使得某一度乘以,然后求.一个显然的暴力是左边求一次最大连续子序列,右边求一次最大连续子序列,然后中间乘以.
但是这样的时间复杂度是的,显然不可取.那我们换种思路直接线性dp.
表示到了第几个数,状态是哪个.这里我们设立三个状态::表示以结尾且未使用的的.表示以结尾的.表示以结尾且考虑了情况的.然后答案就是对三种状态取个.那么三种状态的转移方程如下:

.

.

.

时间复杂度就降到了.

代码:

#include <iostream>
using namespace std;
typedef long long ll;
const int N=3e5+5,M=3;
ll f[N][M],a[N];
int main()
{
    ll n,x,ans=0;
    cin>>n>>x;
    for(int i=1;i<=n;i++)    cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        f[i][0]=max(f[i-1][0]+a[i],a[i]);
        f[i][1]=max(max(f[i-1][0],f[i-1][1])+a[i]*x,a[i]*x);
        f[i][2]=max(max(f[i-1][2],max(f[i-1][1],f[i-1][0]))+a[i],a[i]);
        ans=max(ans,max(f[i][0],max(f[i][1],f[i][2])));    
    }cout<<ans<<'\n';
    return 0;
}