//补题;
意:给一个数组a;ai可以分为xi两个正整数yi且xi+yi=ai and (xi−s)⋅(yi−s)≥0.
定义F=a1⋅x2+y2⋅x3+y3⋅x4+…+yn−2⋅xn−1+yn−1⋅an;问取得minF为多少
思路:ai=xi+(ai-xi);丢进公式里可以发现保证xi>=s&&yi>=s;每次的xi的xi(或n-xi的xi)最好取最大时最优;
对于ai>s:有ai-s 和 s;
ai<=s:有 0 和 ai
//这样使得xi,yi中有一个为最大
对于a1后面的操作,不确定用最大还是最小时;又可以开始dp了
//状态机:)
f[i,j]:操作到ith个位置,状态为j的min
f[i,0]:第i个取mn时
->i-1th个取ma[i-1]时;即f[i-1,0]//ma[i-1]被放在了f[i]的位置上;f[i-1]只能是mn[i-1])
->i-1th个取mn[i-1]时;即f[i-1,1]//f[i-1]上取了ma[i-1]
f[i,1]同理
//注意处理a[1],a[n];因为从a1*x2开始,所以这里从i=2开始
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10,M=1e9;
int n, m, s;
int a[N], f[N][2], mn[N], ma[N];//前i个且ith个状态为j的min
void solve()
{
cin >> n >> s;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
int s0, s1;
if (a[i] > s)
{
s0 = a[i] - s, s1 = s;
mn[i] = min(s0, s1);
ma[i] = max(s0, s1);
}
else
{
mn[i] = 0;
ma[i] = a[i];
}
}
mn[1] = ma[1] = a[1];
mn[n] = ma[n] = a[n];
for (int i = 2; i <= n; i++)
{
f[i][0] = min(f[i - 1][0] + ma[i - 1] * mn[i], f[i - 1][1] + mn[i - 1] * mn[i]);
f[i][1] = min(f[i - 1][0] + ma[i - 1] * ma[i], f[i - 1][1] + mn[i - 1] * ma[i]);
}
cout << min(f[n][1], f[n][0]) << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int _ = 1;
cin >> _;
while (_--)solve();
}