rt,只过掉了 m=2 和最后两个点。
不知道是wqs寄了还是斜率优化寄掉了。
求大佬帮帮
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <random>
#include <bitset>
#define int long long
#define double long double
#define p1(x) x.first
#define p2(x) x.second
#define i128 __int128_t
#define endl "\n"
//#pragma GCC optimize(2)
#define w(x) w[x]
//#define siz(x) t[x].siz
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
#define pii pair<int,int>
//若汁记好了以后再用Ctrl+C/+V你就是狗
using namespace std;
bool FSTRD;
char buf[1<<20],*p1,*p2;
inline char gc(){
if(!FSTRD){
char x;
cin>>x;
return x;
}
if(p1==p2)
p2=(p1=buf)+fread(buf,1,1<<20,stdin);
if(p1==p2)return EOF;
return *p1++;
}
inline int rd(){
if(!FSTRD){
int x;
cin>>x;
return x;
}
int p=1;
int x=0,w=gc();
while(w<'0'||w>'9'){
if(w=='-')p=-1;
w=gc();
}
while(w>='0'&&w<='9')x=x*10+w-'0',w=gc();
return x*p;
}
inline void rd(vector<int*>T){
for(auto x:T)
*x=rd();
}
int n,m;
int s[100300];
struct node{
int x,y,s;
friend node operator-(const node A,const node B){
return {A.x-B.x,A.y-B.y};
}
friend i128 operator *(const node A,const node B){
return (i128)A.x*B.y-A.y*B.x;
}
inline double sl(){
return 1.l*y/x;
}
}T[100300];
deque<int>q;
inline void ins(int x){
while(q.size()>=2&&(
(T[x]-T[q.size()-2]).sl()
<
(T[q.back()]-T[q.size()-2]).sl()
||
(
(T[x]-T[q.size()-2]).sl()
==
(T[q.back()]-T[q.size()-2]).sl()
&&
T[q.back()].s<=T[x].s
)
)
)q.pop_back();
q.push_back(x);
}
inline int g(int k){
while(q.size()>=2&&(
(T[q[1]]-T[q[0]]).sl()<k
||
(
(T[q[1]]-T[q[0]]).sl()==k
&&
T[q[1]].s>=T[q[0]].s
)
)
)
q.pop_front();
return q.front();
}
pii dp[100300];
inline pii calc(int p){
memset(dp,0x3f,sizeof(dp));
dp[0]={0,0};
q.clear();
T[0]={0,0};
ins(0);
for(int i=1;i<=n;i++){
int k=2*(s[i]+1);
int j=g(k);
// cout<<j<<" ";
// cout<<q.back()<<" ";
dp[i]={p1(dp[j])
+s[j]*s[j]
+(s[i]+1)*(s[i]+1)
-2*(s[i]+1)*s[j]
+p,
p2(dp[j])+1
};
T[i]={s[i],p1(dp[i])+s[i]*s[i],p2(dp[i])};
//cout<<T[i].x<<" "<<T[i].y<<endl;
ins(i);
}
// cout<<endl;
return dp[n];
}
signed main(){
ios::sync_with_stdio(0);
// freopen("","r",stdin);
// freopen("","w",stdout);
// FSTRD=1;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>s[i],s[i]+=s[i-1];
int l=0,r=1e16;
int res=0;
while(l<r){
int mid=(l+r)>>1;
if(p2(calc(mid))>=m)res=mid,l=mid+1;
else r=mid-1;
}
// cout<<l<<endl;
pii A=calc(res);
cout<<p1(A)-m*res<<endl;
return 0;
}
/*
*/