zoukankan      html  css  js  c++  java
  • bzoj1010-[HNOI2008]玩具装箱toy

    斜率优化.

    发现

    [dp[i] = min(dp[j]+(i−j−1+sum[i]−sum[j]−L)^2 (j<i) ]

    [dp[i] = min( -2*(sum[i]+i-l-1)*(sum[j]+j)+dp[j]+(sum[j]+j)^2 ) +(sum[i]+i-l-1)^2 ]

    其中 (2*(sum[i]+i-l-1)), ((sum[j]+j)) 都是单调的,因此可以斜率优化.

    双端队列维护下凸壳.

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #include<map>
    using namespace std;
    #define rep(i,l,r) for(register int i=(l);i<=(r);++i)
    #define repdo(i,l,r) for(register int i=(l);i>=(r);--i)
    #define il inline
    typedef double db;
    typedef long long ll;
    
    //---------------------------------------
    const int nsz=5e4+5;
    ll n,l,sum[nsz],dp[nsz];
    int qu[nsz],qh=1,qt=0;
    
    il ll p2(ll v){return v*v;}
    ll x(int p){return sum[p]+p;}
    ll y(int p){return dp[p]+p2(sum[p]+p);}
    ll k(int p){return 2*(sum[p]+p-l-1);}
    db slope(int p1,int p2){return ((db)y(p2)-y(p1))/((db)x(p2)-x(p1));}
    
    ll sol(){
    	dp[0]=0;
    	qu[++qt]=0;
    	ll k0;
    	rep(i,1,n){
    		k0=k(i);
    		while(qh<qt&&slope(qu[qh],qu[qh+1])<k0)++qh;
    		dp[i]=-k0*x(qu[qh])+y(qu[qh])+p2(sum[i]+i-l-1);
    		while(qh<qt&&slope(qu[qt-1],qu[qt])>slope(qu[qt],i))--qt;
    		qu[++qt]=i;
    	}
    //	rep(i,1,n)cout<<dp[i]<<' ';
    //	cout<<'
    ';
    	return dp[n];
    }
    int main(){
    	ios::sync_with_stdio(0),cin.tie(0);
    	cin>>n>>l;
    	rep(i,1,n){
    		cin>>sum[i],sum[i]+=sum[i-1];
    	}
    	cout<<sol()<<'
    ';
    	return 0;
    }
    
  • 相关阅读:
    Java进阶知识查漏补缺06
    SQL学习记录(concat)
    Restful API学习
    git学习
    获得xmlhttp对象
    vue-cli初接触
    vue初接触
    java使用百度UNIT
    JSON学习
    通用Mapper警告:建议修改基本类型为对应的包装类型!
  • 原文地址:https://www.cnblogs.com/ubospica/p/9884386.html
Copyright © 2011-2022 走看看