计算两两之间的和的序列,就是和最小连续子串和类似的dp了
注意区间内的值是*k平方不要被-1迷惑
注意将单个值*k的操作需要单独枚举
注意long long
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
long long a[maxn];
long long b[maxn];
long long s[maxn];
long long mi[maxn];
int main()
{
long long n, k, i, j;
cin>>n>>k;
long long res=0, ans;
for(int i=0; i<n; i++)
{
scanf("%lld %lld", &a[i], &b[i]);
if(i)s[i]=b[i-1]*a[i];
res+=s[i];
}
long long m=400000000000;
mi[0]=s[1]*k-s[1];
m=mi[0];
for(int i=1; i<n; i++)
{
mi[i]=mi[i-1]+s[i]*k*k-s[i]*k+s[i+1]*k-s[i+1];
// printf("%d-", mi[i]);
mi[i]=min(mi[i], s[i]*k*k-s[i]+s[i-1]*k-s[i-1]+s[i+1]*k-s[i+1]);
m=min(m, mi[i]);
m=min(m, s[i]*k-s[i]+s[i+1]*k-s[i+1]);
// printf("%d ", mi[i]);
}
ans=min(res,res+m);
printf("%lld\n", ans);
return 0;
}