写了一道单调性优化发现 跟斜率优化很像,而且这道题目感觉质量非常的好。

其实斜率优化是基于单调性优化的,但是面对这道题 我竟然连单调性优化都不太会,尽管这个模型非常不好理解。

对于每道题 我都会打一个暴力 程序一般可得40分左右考试的时候我想时间够的话可以对拍(尽管现在不太会了)。

dp 考虑 f[i]表示第i个数字的最小的p值

f[i]=max(f[i],a[j]-a[i]+sprt(abs(i-j))(向上))其中 j∈[1,n];

将其优化的话第一要先去掉绝对值然后形成两个dp式子

f[i]=max{a[j]-a[i]+sqrt(i-j)}(1<=j<i) f[i]=max{a[j]-a[i]+sqrt(j-i)}(i<j<=n)

发现i j紧紧的连在一起根本不是斜率优化的模型 看完一篇超级不错的题解之后发现是具有单调性的

f[i]=max{a[j]+sqrt(i-j)}-a[i]; 想个办法使得a[j]+sqrt(i-j)最大

发现是单调性优化 get! sqrt(n)的增长速度随n的增大而减小

因为设 j<k<i 如果 a[j]+sqrt(i-j)<a[k]+sqrt(i-k)那么j就被废了 永远都不可能成为最优解

如果 a[j]+sqrt(i-j)>a[k]+sqrt(i-k)那么在某一时刻k会比j优秀 决策就拥有了单调性 单调递增

开一个三元组(p,l,r) p在l 到 r这个区间之中可以取到最优值开心的dp了

const int MAXN=;
int n;
int a[MAXN];
db f[MAXN],b[MAXN];
struct wy
{
int p,l,r;
}q[MAXN];
inline db max1(db x,db y){return x>y?x:y;}
inline db calculate(int x,int y)
{
return db(a[x]+b[abs(y-x)]-a[y]);
}
inline void swap1(db &x,db &y){db t;t=y;y=x;x=t;return;}
inline void swqp(int &x,int &y){int t;t=x;y=x;x=t;return;}
int ask(wy p,int x)
{
int l=p.l,r=p.r+;
while(l+<r)
{
int mid=(l+r)>>;
if(calculate(p.p,mid)<calculate(x,mid))r=mid;
else l=mid;
}
if(calculate(p.p,l)<=calculate(x,l))return l;
return r;
}
void dp()
{
int h,t;h=t=;++h;
for(int i=;i<=n;i++)
{
q[h].l++;
if(h<=t&&q[h].l>q[h].r)h++;
if(h>t||calculate(i,n)>calculate(q[t].p,n))
{
while(h<=t&&calculate(i,q[t].l)>=calculate(q[t].p,q[t].l))--t;
if(h>t)q[++t]=(wy){i,i,n};
else
{
int x=ask(q[t],i);
q[t].r=x-;
q[++t]=(wy){i,x,n};
}
}
f[i]=max1(f[i],calculate(q[h].p,i));
}
}
int main()
{
//freopen("1.in","r",stdin);
n=read();
for(int i=;i<=n;i++)a[i]=read(),b[i]=sqrt(1.0*i);
dp();
for(int i=,j=n;i<j;i++,j--)swap(a[i],a[j]),swap1(f[i],f[j]);
dp();
for(int i=n;i>=;i--)put(ceil(f[i]));
return ;
}

这道题目就是比较难一类的 斜率优化需要转换一下问题 至于问题的转换我是看书的因为没想到贪心当时脑子有点乱

看完书上巧妙的转换了问题之后 明白了这竟然是一道比较简单的斜率优化问题! 2A了(第一次写的是bf)

f[i][j]表示第i个饲养员接走前j个小猫所花费的最小时间

f[i][j]=min(f[i-1][j],f[i-1][k]+t[j]*(j-k)-(s[j]-s[k]));

t数组是 每个接小猫的花费的最小时间  s[k]是前缀和 t[i]=t1[i]-d[i];

然后f[i][j]=min(f[i-1][j],f[i-1][k]+t[j]*(j-k)-(s[j]-s[k]));(1<=k<=j)

此时我处理的是k+1~j的范围内的东西

f[i][j]=min{f[i-1][k]+t[j]*j-t[j]*k-s[j]+s[k]};

f[i][j]=min(f[i-1][k]-t[j]*k+s[k]}+t[j]*j-s[j];

f[i][j]=min(f[i-1][k]+s[k]-t[j]*k};

f[i-1][k]+s[k]=f[i][j]+t[j]*k;

以k为横坐标t[j]为斜率 斜率为定值 我只需让截距f[i][j]最小即可

那么现在t[j]是单调递增的那么维护一个下凸壳就可以...嘿嘿嘿

这么简单的斜率优化问题。成功AC

const int MAXN=;
int n,m,p;
ll d[MAXN],t[MAXN],s[MAXN];
ll min(ll x,ll y){return x>y?y:x;}
ll f[][MAXN],l,r,q[MAXN];
ldb k(ll w,ll x,ll y){return (1.0*(f[w-][x]+s[x]-f[w-][y]-s[y]))/(1.0*(x-y));}
int main()
{
//freopen("1.in","r",stdin);
n=read();m=read();p=read();
for(int i=;i<=n;i++)d[i]=read(),d[i]+=d[i-];
//for(int i=1;i<=n;i++)cout<<d[i]<<' ';puts("");
for(int i=;i<=m;i++)
{
int x,y;
x=read();y=read();
t[i]=y-d[x];
}
//for(int i=1;i<=m;i++)cout<<t[i]<<' '<<endl;
sort(t+,t++m);
//for(int i=1;i<=m;i++)cout<<t[i]<<' '<<endl;
for(int i=;i<=m;i++)s[i]=t[i]+s[i-];
//for(int i=1;i<=m;i++)cout<<s[i]<<' '<<endl;
for(int i=;i<=m;i++)f[][i]=t[i]*i-s[i];
for(int i=;i<=p;i++)
{
l=r=;l=;q[++r]=;
for(int j=;j<=m;j++)
{
f[i][j]=INF*1000000ll;
while(l<r&&k(i,q[l],q[l+])<=t[j])++l;
f[i][j]=min(f[i][j],f[i-][q[l]]-t[j]*q[l]+s[q[l]]+t[j]*j-s[j]);
//f[i][j]=min(f[i][j],f[i-1][j-1]+t[j]-s[j]+s[j-1]);
//cout<<f[i][j]<<endl;
//cout<<q[l]<<endl;
while(l<r&&k(i,q[r-],q[r])>=k(i,q[r],j))--r;
q[++r]=j;
}
}
put(f[p][m]);
return ;
}

如果黑洞能吞下一百亿个太阳,我,就是第一百亿零一个太阳。

斜率优化&单调性优化的相似性的更多相关文章

  1. Lightning Conductor 洛谷P3515 决策单调性优化DP

    遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序 ...

  2. 单调性优化DP

    单调性优化DP Tags:动态规划 作业部落链接 一.概述 裸的DP过不了,怎么办? 通常会想到单调性优化 单调队列优化 斜率优化 决策单调性 二.题目 [x] 洛谷 P2120 [ZJOI2007] ...

  3. [BZOJ4850][JSOI2016]灯塔(分块/决策单调性优化DP)

    第一种方法是决策单调性优化DP. 决策单调性是指,设i>j,若在某个位置x(x>i)上,决策i比决策j优,那么在x以后的位置上i都一定比j优. 根号函数是一个典型的具有决策单调性的函数,由 ...

  4. P1912 [NOI2009]诗人小G[决策单调性优化]

    地址 n个数划分若干段,给定$L$,$p$,每段代价为$|sum_i-sum_j-1-L|^p$,求总代价最小. 正常的dp决策单调性优化题目.不知道为什么luogu给了个黑题难度.$f[i]$表示最 ...

  5. P3515 [POI2011]Lightning Conductor[决策单调性优化]

    给定一序列,求对于每一个$a_i$的最小非负整数$p_i$,使得$\forall j \neq i $有$ p_i>=a_j-a_i+ \sqrt{|i-j|}$. 绝对值很烦 ,先分左右情况单 ...

  6. 决策单调性优化dp 专题练习

    决策单调性优化dp 专题练习 优化方法总结 一.斜率优化 对于形如 \(dp[i]=dp[j]+(i-j)*(i-j)\)类型的转移方程,维护一个上凸包或者下凸包,找到切点快速求解 技法: 1.单调队 ...

  7. [NOI2009]诗人小G(dp + 决策单调性优化)

    题意 有一个长度为 \(n\) 的序列 \(A\) 和常数 \(L, P\) ,你需要将它分成若干段,每 \(P\) 一段的代价为 \(| \sum ( A_i ) − L|^P\) ,求最小代价的划 ...

  8. CF868F Yet Another Minimization Problem 分治决策单调性优化DP

    题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...

  9. 算法学习——决策单调性优化DP

    update in 2019.1.21 优化了一下文中年代久远的代码 的格式…… 什么是决策单调性? 在满足决策单调性的情况下,通常决策点会形如1111112222224444445555588888 ...

随机推荐

  1. 根据元素类型获取tuple中的元素

    最近做cinatra遇到这样的需求,根据一个type来获取对应的第一个元素,需要注意的一个问题是,如果没有这个类型的时候,通过编译期断言提醒使用者,实现代码如下: 1.C++14实现 template ...

  2. linux每日命令(37):top命令

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来不断刷新 ...

  3. Android Studio原生库创建示例

    [时间:2017-07] [状态:Open] [关键词:Android,Android Studio,gradle,native,c,c++,cmake,原生开发] 0 引言 最近在工作中遇到了升级A ...

  4. 关于Unity中NGUI的Pivot和锚点

    Pivot 1.创建一个Sprite类型的Sprite1节点,关联一个图集和一张贴图,用图中的六个按钮调整这个贴图的Pivot点,一共有八个点可以选择 2.再创建一个Sprite类型的Sprite2节 ...

  5. 80x86的保护模式

    什么是保护模式? 通过对程序使用的存储区采用分段.分页的存储管理机制, 达到分组使用.互不干扰的保护目的.能为每个任务提供一台虚拟处理器,使每个任务单独执行,快速切换. 所以,内存地址由段基地址.偏移 ...

  6. eclipse里将java工程改web工程

    转自:http://blog.csdn.net/heirenheiren/article/details/8488245 把一个普通的eclipse项目转成web项目 1.  编辑工程的.projec ...

  7. IOC容器特性注入第七篇:请求上下文作用域

    Ninject的对象作用域: Transient .InTransientScope() 每次调用创建新实例. Singleton .InSingletonScope() 单例,仅创建一个实例. Th ...

  8. duilib进阶教程 -- TreeView控件(6)

    代码下载:http://download.csdn.net/detail/qq316293804/6483905 上一个教程中,界面已经和迅雷一模一样啦,大小和位置一个像素都不差哟,亏得Alberl调 ...

  9. mui---获取入口文件对象

    在做APP的时候,发现在Hbuilder里面,如果是已经加载过的页面,可以通过 plus.webview.getWebviewById(id),拿到加载的页面对象,这里的id默认是url,但是入口文件 ...

  10. MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】

    1.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视图有如下特点;  1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系.  2. 视 ...