分治优化决策单调性

<!--more-->ios

分治优化决策单调性

在咱们了解的DP方程中,常常会有$f[i]=sum_{max}/sum_{min}/min/max{f[j]+calc(i,j)}$,而且calc(i,j)知足四边形不等式,这种方程存在,而一般状况下,calc(i,j)能够很是轻松的得出,好比说$x^q$,或者sum[i][j],又或者是什么其余的东西。可是,有些时候,咱们并不能在$O(logn)/O(1)$的时间内得出,这种状况下,正常经过维护单调队列而且二分的方法就没办法完成了。数组

这种状况下,咱们就须要考虑calc(i,j)的求法了,这种时候,若是咱们发现calc(i,j)能够经过分治来均摊$O(nlogn)$处理出来的时候,咱们就能够经过总体二分来维护决策单调性来转移,保证总体时间复杂度的正确性。优化

例题时间

BZOJ 5125: [Lydsy1712月赛]小Q的书架

这道题很显然,咱们要将序列分红$K$段使得这$K$段的逆序对和最小。spa

正常DP方程,f[i][j]=f[i-1][k]+calc(k+1,j);blog

咱们发现calc(k+1,j)知足$calc(i,j)+calc(i-1,j+1) \ge calc(i,j+1)+calc(i+1,j)$因此这个具备决策单调性,可是,咱们虽然将DP方程的时间复杂度减小到$O(nklogn)$可是,咱们发现,每次计算calc(i,j)仍是$O(n)$的,因此总时间复杂度不变,所以,咱们考虑用分治优化决策单调性。队列

咱们考虑在总体二分的过程当中,calc(i,j)每一层的时间复杂度为$O(n)$,而一共$logn$层,因此时间复杂度为$O(nlogn)$,这样,在DP的同时,calc(i,j)的时间复杂度也下降了,而为了维护calc(i,j)须要用到树状数组求逆序对,因此总时间复杂度为$O(nklog^2n)$显然,是能够作的...get

若是K出的大一点的话,我以为能够带权二分...因此时间复杂度能够达到$O(nlogklog^2n)$,因此还能够增强增强,嗯,就是下一道考试题了!string

附上代码:it

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <queue>
#include <bitset>
using namespace std;
#define N 40005
int f[N],sum[N],g[N],n,k,rl,rr,ret,a[N];
void fix(int x,int v){for(;x<N;x+=x&-x)sum[x]+=v;}
int find(int x){int re=0;for(;x;x-=x&-x)re+=sum[x];return re;}
void get(int l,int r)
{
    while(rl<l)fix(a[rl],-1),ret-=find(a[rl++]-1);
    while(rl>l)fix(a[--rl],1),ret+=find(a[rl]-1);
    while(rr<r)fix(a[++rr],1),ret+=find(n)-find(a[rr]);
    while(rr>r)fix(a[rr],-1),ret-=find(n)-find(a[rr--]);
}
void solve(int l,int r,int L,int R)
{
    if(l>r)return ;int m=(l+r)>>1,p;
    for(int i=min(m-1,R);i>=L;i--)
    {
        get(i+1,m);
        if(g[i]+ret<f[m])f[m]=g[i]+ret,p=i;
    }solve(l,m-1,L,p);solve(m+1,r,p,R);
}
int main()
{
    scanf("%d%d",&n,&k);rr=n,rl=1;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]),f[i]=f[i-1]+find(n)-find(a[i]),fix(a[i],1);ret=f[n];
    for(int i=2;i<=k;i++)
    {
        memcpy(g,f,sizeof(f[0])*(n+1));
        memset(f,0x3f,sizeof(f[0])*(n+1));
        solve(1,n,1,n);
    }printf("%d\n",f[n]);
}
相关文章
相关标签/搜索