蓝题训练9.25P3195 [HNOI2008] 玩具装箱
P3195 [HNOI2008] 玩具装箱
https://www.luogu.com.cn/problem/P7323
Tag: 略
题意:略
题解:依旧斜率优化
参考代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll maxn=50010;
ll f[maxn];
ll head,tail,n,L,a[maxn];
struct vec{
ll id,x,y;
ll operator()(ll v,ll u){
return x*v+y*u;
}
}q[maxn];
ll cross(vec a,vec b,vec c){
c.x-=b.x;c.y-=b.y;
b.x-=a.x;b.y-=a.y;
return b.x*c.y-b.y*c.x;
}
void solve(){
cin>>n>>L;
for(int i=1;i<=n;i++) {
cin>>a[i];
a[i]+=a[i-1]+1;
}
L++;
head=tail=0;
q[0]={0,0,0};
for(int i=1;i<=n;i++){
while(head<tail&&q[head](2*(L-a[i]),1)>=q[head+1](2*(L-a[i]),1)){
++head;
}
f[i]=q[head](2*(L-a[i]),1)+(a[i]-L)*(a[i]-L);
vec x={i,a[i],f[i]+a[i]*a[i]};
while(head<tail&&cross(q[tail-1],q[tail],x)<=0){
--tail;
}
q[++tail]=x;
}
cout<<f[n]<<"\n";
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
ll T=1;
while(T--) solve();
}

浙公网安备 33010602011771号