CDQ分治
BrooksBUAA
这个作者很懒,什么都没留下…
展开
-
[BZOJ 2253][2010 Beijing wc]纸箱堆叠:CDQ分治|DP
点击这里查看原题首先这是一个严格三维偏序问题,可以用CDQ分治来做,其次这又是一个三维的最长上升子序列问题,dp[i]表示以第i个箱子为结尾的最长长度。 于是我们先将所有箱子按x大小排序,因为要严格上升,因此对于x值相等的情况我们要微调mid的位置,确保x值相等的箱子在一个分治区间内。在每个分治区间内又按y大小排序,对左区间用树状数组维护前缀最大值,对右区间查询前缀最大值。/*User:Smal原创 2017-04-07 08:50:01 · 425 阅读 · 0 评论 -
[BZOJ 3963][WF2011]MachineWorks:CDQ分治|DP斜率优化
点击这里查看原题把所有点按时间排好序,得到方程: f[i]=max{f[j]-p[j]+r[j]+g[j]*(d[i]-d[j]-1)}设x[j]=g[j],y[j]=f[j]-p[j]+r[j]-g[j]*(d[j]+1),则: y[j]=-d[i]*x[j]+f[i]于是维护一个上凸壳进行斜率优化。 但是由于凸壳中的点需要按x坐标排好序,因此需要进行CDQ分治,左区间按x坐标排序维原创 2017-04-07 15:33:58 · 408 阅读 · 0 评论 -
[BZOJ 1492][NOI2007]货币兑换Cash:CDQ分治|DP斜率优化
点击这里查看原题首先贪心的想,每次买卖必然要买空或者卖空,因为有便宜就尽量去占,于是可以得到方程: f[i]=max{f[j]/(a[j]*rate[j]+b[j])*rate[j]*a[i]+f[j]/(a[j]*rate[j]+b[j])*b[i]}其中,x[j]=f[j]/(a[j]*rate[j]+b[j])*rate[j]表示第j天最多可以拥有的A货币的数量,y[j]=f[j]/(a原创 2017-04-06 10:16:28 · 519 阅读 · 0 评论 -
[BZOJ 4237]稻草人:CDQ分治
点击这里查看原题这个CDQ分治需要首先按Y坐标排序,然后每个递归处理的区间内按X坐标排序。每次从右区间加入一个点则将左区间所有Y坐标小于该点的点加入,维护两个单调栈,左区间的是Y坐标递减的栈,右区间是Y坐标单调递增的栈。这样每次加入右区间的点时答案就是 (左区间的栈中的元素数-左栈中Y坐标小于右区间上一个点的Y坐标的点数)有点拗口,具体看代码,用二分搜索得到左栈中Y坐标小于右区间上一个点的Y原创 2017-04-05 14:04:56 · 546 阅读 · 0 评论