传送门

首先求出lislislis
然后对于lisilis_ilisi​按照值分层转移
显然每一层的点是从左上到右下这样单调的

对于相邻两层的转移
可以列出DPDPDP式子
fi=min⁡j,xj<xi,yj<yi(fj+(xi−xj)∗(yi−yj))f_i=\min_{j,x_j<x_i,y_j<y_i}(f_j+(x_i-x_j)*(y_i-y_j))fi​=minj,xj​<xi​,yj​<yi​​(fj​+(xi​−xj​)∗(yi​−yj​))
冷静一下发现没法直接斜率优化

首先不考虑i→ji\rightarrow ji→j要满足xi<xj,yi<yjx_i<x_j,y_i<y_jxi​<xj​,yi​<yj​的限制
考虑如果i,j(i<j)i,j(i<j)i,j(i<j)转移到kkk
若jjj比iii优
有fj+(xk−xj)(yk−yj)<fi+(xk−xi)(yk−yi)f_j+(x_k-x_j)(y_k-y_j)<f_i+(x_k-x_i)(y_k-y_i)fj​+(xk​−xj​)(yk​−yj​)<fi​+(xk​−xi​)(yk​−yi​)
xk(yi−yj)+yk(xi−xj)≤(fi+xiyi)−(fj+xjyj)x_k(y_i-y_j)+y_k(x_i-x_j)\le(f_i+x_iy_i)-(f_j+x_jy_j)xk​(yi​−yj​)+yk​(xi​−xj​)≤(fi​+xi​yi​)−(fj​+xj​yj​)
由于i,ji,ji,j同一层是单调的,所以yi−yj,xi−xjy_i-y_j,x_i-x_jyi​−yj​,xi​−xj​一定一正一负
对于i,ji,ji,j看做常量的话就是对于k(xk,yk)k(x_k,y_k)k(xk​,yk​)就是一个斜率为正的直线的一侧
由于kkk也是单调的
所以转移具有决策单调性
不过注意如果按照xxx有序的话决策单调性是反的
即i,ji,ji,j越大,可以转移的kkk为越小的一段
于是分治优化即可

现在考虑x,yx,yx,y大小的限制
可以分治优化
由于每一层点单调
所以分治可以做到一个logloglog

复杂度O(nlog2n)O(nlog^2n)O(nlog2n)

#include<bits/stdc++.h>
using namespace std;
#define cs const
#define int long long
#define re register
#define pb push_back
#define pii pair<int,int>
#define ll long long
#define y1 shinkle
#define fi first
#define se second
#define bg begin
cs int RLEN=1<<20|1;
inline char gc(){static char ibuf[RLEN],*ib,*ob;(ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));return (ib==ob)?EOF:*ib++;
}
inline int read(){char ch=gc();int res=0;bool f=1;while(!isdigit(ch))f^=ch=='-',ch=gc();while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();return f?res:-res;
}
inline ll readll(){char ch=gc();ll res=0;bool f=1;while(!isdigit(ch))f^=ch=='-',ch=gc();while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();return f?res:-res;
}
inline int readstring(char *s){int top=0;char ch=gc();while(isspace(ch))ch=gc();while(!isspace(ch)&&ch!=EOF)s[++top]=ch,ch=gc();return top;
}
template<typename tp>inline void chemx(tp &a,tp b){a<b?a=b:0;}
template<typename tp>inline void chemn(tp &a,tp b){a>b?a=b:0;}
cs int N=200005,M=1000005;
int n,lm,ln;
namespace bit{int tr[M];#define lb(x) (x&(-x))inline void update(int p,int k){for(;p<=lm;p+=lb(p))chemx(tr[p],k);}inline int query(int p,int res=0){for(;p>0;p-=lb(p))chemx(res,tr[p]);return res;}
}
pii p[N];
inline ll dis(pii x,pii y){return abs((ll)(x.fi-y.fi)*(x.se-y.se));
}
int ls[N];
ll f[N];
vector<int> pt[N],z;
namespace Seg{vector<int> q[N<<2],tp;#define lc (u<<1)#define rc ((u<<1)|1)#define mid ((l+r)>>1)void update(int u,int l,int r,int k){// cout<<z[l]<<" "<<z[r]<<" "<<k<<" "<<p[k].se<<" "<<p[z[l]].se<<" "<<p[k].fi<<" "<<p[z[r]].fi<<'\n';if(p[k].se>=p[z[l]].se&&p[k].fi>=p[z[r]].fi){// cout<<l<<" "<<r<<" "<<k<<'\n';q[u].pb(k);return;}if(p[k].se<=p[z[r]].se||p[k].fi<=p[z[l]].fi)return;update(lc,l,mid,k),update(rc,mid+1,r,k);}void solve(int l,int r,int ql,int qr){ll res=1e18;int ps=0,id=tp[mid];for(int i=ql;i<=qr;i++){ll now=f[z[i]]+dis(p[z[i]],p[id]);if(now<res)res=now,ps=i;}chemn(f[id],res);if(l<mid)solve(l,mid-1,ps,qr);if(mid<r)solve(mid+1,r,ql,ps);}void query(int u,int l,int r){if(q[u].size()){tp=q[u];solve(0,q[u].size()-1,l,r);q[u].clear();}if(l==r)return;query(lc,l,mid),query(rc,mid+1,r);}#undef lc#undef rc#undef mid
}
inline void trans(cs vector<int> &pre,cs vector<int> &now){z=pre;int l=(int)pre.size()-1;for(int x:now){Seg::update(1,0,l,x);}Seg::query(1,0,l);
}
signed main(){#ifdef Stargazerfreopen("lx.in","r",stdin);#endifn=read(),lm=read();for(int i=1;i<=n;i++)p[i].fi=read(),p[i].se=read();sort(p+1,p+n+1);for(int i=1;i<=n;i++){ls[i]=bit::query(p[i].se)+1;chemx(ln,ls[i]);bit::update(p[i].se,ls[i]);pt[ls[i]].pb(i);// cout<<i<<" "<<ls[i]<<'\n';}memset(f,127/3,sizeof(f));for(int &i:pt[1])f[i]=dis(p[i],pii(0,0));//,cout<<i<<" "<<f[i]<<'\n';for(int i=2;i<=ln;i++)trans(pt[i-1],pt[i]);ll res=1e18;for(int &i:pt[ln])chemn(res,f[i]+dis(p[i],pii(lm,lm)));cout<<res<<'\n';
}

【洛谷 P5244】 [USACO19FEB]Mowing Mischief P(分治 / 决策单调性优化DP)相关推荐

  1. Luogu P5244 [USACO2019Feb Platinum] Mowing Mischief (动态规划、决策单调性)

    题目链接 https://www.luogu.com.cn/problem/P5244 题解 首先求出 LIS. 根据 LIS 的值我们可以对整个点集分层,每一层内进行 DP. 将每层的点按 \(x_ ...

  2. [CodeForces1603D] Artistic Partition(四边形不等式 + 决策单调性优化dp + 分治 + 线性筛 + 数论分块)

    problem codeforces 对于给定的正整数 l≤l\leql≤,定义 c(l,r)c(l,r)c(l,r) 为满足下列条件的正整数对 (i,j)(i,j)(i,j) 的数量: l≤i≤j≤ ...

  3. 【CF868F】Yet Another Minimization Problem (决策单调性优化dp+分治)

    description 点击查看题目 solution code 设dpi,jdp_{i,j}dpi,j​:把前iii个数划分jjj段的最小花费,wi,jw_{i,j}wi,j​:[i,j][i,j] ...

  4. BZOJ2687 交与并/BZOJ2369 区间【决策单调性优化DP】【分治】

    Description 对于一个区间集合 {A1,A2--Ak}(K>1,Ai不等于Aj(i不等于J),定义其权值 S=|A1∪A2∪--AK|*|A1∩A2--∩Ak| 即它们的交区间的长度乘 ...

  5. 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)

    题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...

  6. 洛谷 P4544 [USACO10NOV]Buying Feed G)(单调队列优化DP)

    题目链接:P4544 [USACO10NOV]Buying Feed G 建议做这题前先做下这题P1886 滑动窗口 /[模板]单调队列 我们可以用dp[i][j]表示当前走到前i个点,已经买了j吨饲 ...

  7. BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...

  8. 分羊(区间dp:分治与决策单调性优化)

    文章目录 题目描述 样例输入 样例输出 解析 代码 题目描述 给你一个数列,分成m段,每段的价值为相同数对的对数 求最小价值和 样例输入 10 2 1 2 1 2 1 2 1 2 1 2 样例输出 8 ...

  9. NOIP2020洛谷P7115:移球游戏(分治)

    解析 先考虑n=2的情况 可以利用一个空队在不超过5m的操作次数下把两个满队还原 如何推广? 考虑分治 把[l,mid]的球看成同色,[mid+1,r]的球看成同色 在左右两两匹配柱子进行n=2的还原 ...

  10. 【洛谷 P4886】 快递员 (点分治)

    这题因为一些小细节还是\(debug\)了很久...不过我第一次用脚本对拍,不亏. 先随便找一个点作为根,算出答案,即所有点对到这个点的距离和的最大值,并记录所有距离最大的点对.如果这个点在任意一个距 ...

最新文章

  1. python queue模块安装_Python queue包_程序模块 - PyPI - Python中文网
  2. Python开发利器之UliPad
  3. vim 编辑演示_改变我生活的7个Vim技巧(含演示)
  4. Android初学第53天
  5. 2016/11/07 线程的创建和启动
  6. 【C++】类型转换(const_cast、dynamic_cast、static_cast、reinterpret_cast)
  7. java判断safari_js代码判断浏览器种类IE、FF、Opera、Safari、chrome及版本
  8. 自动驾驶 9-6: EKF 的替代方案 - 无迹卡尔曼滤波器
  9. 酷狗php 技术题目,广州酷狗php面试题(赋答案)
  10. python计算iv值_python计算IV值
  11. 动手学深度学习讲义批量下载
  12. 微信测试是否被删软件,检测微信是否被删,这个方法超好用!
  13. 如何成为微信小程序的开发者?
  14. 人生十个阶段,每七年周期变化
  15. FCW前车碰撞预警的两个重要指标——THW、TTC
  16. 什么是数据工程师,主要做哪些工作?
  17. 丝印代码html,常用贴片二三极管丝印 印字 代码
  18. Word美化代码块样式
  19. 微软模拟飞行10厦门航空涂装_《微软模拟飞行》海量附加内容!最真实的飞行体验...
  20. linux下tar解压文件(解决unzip无法解压超过2gb文件方法

热门文章

  1. 无损内嵌字幕到mkv文件
  2. java 创建gbase,GBase 8t使用Java UDR的方法
  3. HTTP状态码滑稽表情包
  4. VS2019 团队资源管理器--Git的使用(二)
  5. python提示语法错误_python出现语法错误怎么办
  6. “新浪UC”的后江湖时代------易名新浪SHOW重出江湖
  7. 硬件设计18之什么是VGA?
  8. java课程设计模拟科学计算器_JAVA课程设计科学计算器
  9. python实用贺卡制作
  10. 使用XPath+Chrome浏览器解析网站的数据