rt 我标了注释的那行 调用了 bool better(line A,line B,line C) 这一函数 但是我前两个参数传了俩 int 它过编译了 甚至过了俩样例 甚至得了 30 分 所以它干了啥呀 求助是啥子原理/kel
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
#define mk make_pair
const int N=1e5+7;
int a[N],s[N],n;
int f[N],g[N];
struct line
{
int k,b,id;
line(int k=0,int b=0,int id=0):k(k),b(b),id(id){}
}q[N];
inline bool cmin(int &x,int y){return x>y?x=y,1:0;}
#define lll __int128
inline bool better(line C,line A,line B)
{
return (lll)(C.b-A.b)*(B.k-C.k)<(lll)(C.b-B.b)*(A.k-C.k);
}
pii solve(int W)
{
memset(f,0x1f,sizeof(f));
f[0]=g[0]=0;
int L=1,R=1;
q[1]=line(0,1,0);
for(int i=1;i<=n;i++)
{
while(L<R&&q[L].k*s[i]+q[L].b>q[L+1].k*s[i]+q[L+1].b)L++;
f[i]=q[L].k*s[i]+q[L].b+s[i]*s[i]+2*s[i]+W,g[i]=g[q[L].id]+1;
line nw=line(-2*s[i],f[i]-2*s[i]+1+s[i]*s[i],i);
while(L<R&&better(R-1,R,nw))R--;////////////////////
q[++R]=nw;
}
return mk(f[n],g[n]);
}
int wqs(int k)
{
int l=-1e18,r=1e18,ans;
while(l<r)
{
int mid=l+r>>1;
if(solve(mid).se<=k)r=mid-1,ans=mid;
else l=mid+1;
}
return ans;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
int k=wqs(m);
cout<<solve(k).fi-m*k;
return 0;
}