前言

然而丝之鸽还是没有出


正题

题目链接:https://www.luogu.com.cn/problem/P6047


题目大意

两个平行的线,上面连接着若干条弦,第iii条连接上方的xix_ixi​个下方的yiy_iyi​。
然后每次可以选择一个位置(i,j)(i,j)(i,j),可以切断任何位于位置(u,v)(u,v)(u,v)的弦仅当满足条件(u>i,v<j)(u>i,v<j)(u>i,v<j),消耗代价为ai∗bja_i*b_jai​∗bj​。

求切断所有线的最小代价。


解题思路

如果我们将下面那条线翻转过来,我们就有条件(u>i,v>j)(u>i,v>j)(u>i,v>j),我们将弦看成坐标的话,我们可以发现其实就是每次选择一个点然后将右下角的点都去掉。

所以就有以下优化

  1. 如果一个弦代表的点在其他弦代表点的右下角,那么该点不影响结果。可以去掉
  2. 如果一个点的代价比他右上角的其中一个点的代价高,那么必定选那个点更优。所以我们可以对于aaa和bbb都取一个前缀minminmin

做完以下优化后,对于弦我们可以求到xxx递增,yyy递减的序列。转换到之后就是axa_xax​递减,byb_yby​递增的序列,可以进行dpdpdp。
fi=min{fj,fj+axj+1byi}f_i=min\{f_j,f_j+a_{x_j+1}b_{y_i}\}fi​=min{fj​,fj​+axj​+1​byi​​}
考虑斜率优化
fi=fj+axj+1byif_i=f_j+a_{x_j+1}b_{y_i}fi​=fj​+axj​+1​byi​​
转换成函数
fj=−axj+1byi+fif_j=-a_{x_j+1}b_{y_i}+f_ifj​=−axj​+1​byi​​+fi​

斜率为−byi-b_{y_i}−byi​​要求截距最小,维护下凸壳(斜率递增)。

然后因为都是单调的,可以用单调队列维护。


codecodecode

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=3e5+10;
struct node{ll x,y;
}a[N];
ll n,m,q[N];
double x[N],y[N],f[N];
bool cmp(node x,node y)
{return (x.x==y.x)?(x.y<y.y):(x.x<y.x);}
double slope(ll i,ll j){if(a[i+1].x==a[j+1].x)return 1e18;return (f[i]-f[j])/(a[j+1].x-a[i+1].x);
}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%lf",&x[i]);for(ll i=n;i>=1;i--)scanf("%lf",&y[i]);x[0]=y[0]=1e18;for(ll i=1;i<=n;i++)x[i]=min(x[i],x[i-1]),y[i]=min(y[i],y[i-1]);for(ll i=1;i<=m;i++)scanf("%lld%lld",&a[i].x,&a[i].y),a[i].y=n-a[i].y+1;sort(a+1,a+1+m,cmp);ll p=0;a[0].y=2147483647/3;for(ll i=1;i<=m;i++)if(a[i].y<a[p].y)a[++p]=a[i];m=p;ll l=1,r=1;for(ll i=1;i<=m;i++)a[i].x=x[a[i].x-1],a[i].y=y[a[i].y-1];for(ll i=1;i<=m;i++){while(l<r&&slope(q[l],q[l+1])<=a[i].y)l++;ll pos=q[l];f[i]=f[pos]+a[pos+1].x*a[i].y;while(l<r&&slope(q[r-1],q[r])>slope(q[r],i))r--;q[++r]=i;}printf("%.0lf",f[m]);
}

P6047-丝之割【斜率优化,dp】相关推荐

  1. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  2. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  3. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

  4. HDU-3507Print Article 斜率优化DP

    学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...

  5. APIO2010 特别行动队 斜率优化DP算法笔记

    做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...

  6. HDU 3507 Print Article(斜率优化DP)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

  7. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

  8. YBTOJ洛谷P3195:玩具装箱(斜率优化dp)

    传送门 文章目录 前言 解析 代码 前言 斜率优化dp,就是利用斜率优化的dp (逃) 解析 第一道斜优的题 分析题目 设sumisum_isumi​为1-i的c的前缀和 容易写出dp转移式: dpi ...

  9. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 11893  Solved: 5061 [Submit] ...

  10. 【bzoj1010】玩具装箱toy——斜率优化dp

    题目链接 第一道自己推的斜率优化dp>< 首先要明确一点:装进同一个容器的toys一定要是连着的几个(否则的话可以直接贪心)-->之前理解错题意WA了一次...... 用sum[i] ...

最新文章

  1. 怎么使用 Caffe 进行 LetNet-5 的训练和预测
  2. IDEA spring boot maven架包
  3. OC之非ARC环境下循环retain问题
  4. java 并发线程_Java并发教程–线程之间的可见性
  5. 牛津、剑桥、OpenAI联合发出AI预警《人工智能的恶意使用》
  6. A deep learning model integrating FCNNs and CRFs for brain tumor segmentation
  7. 软件以人为本1 - 序 - 写于上海2011 ScrumGathering会后
  8. Oracle安装基本步骤
  9. C++实现身份证校验和归属地查询
  10. 前端 报培训班还是自学
  11. 游戏应用市场APP软件下载平台网站源码+手机版
  12. python写文件字母_Python - 文件读写
  13. HSV颜色分割,RGB与HSV颜色空间的关系
  14. | 一文 uiautomator2 自动化测试工具使用
  15. PHP实现阿拉伯数字转中文大写
  16. 阿里云上一键安装lnmp或lamp
  17. 构建基于docker的airflow并访问有kerberos认证的cdh集群
  18. [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  19. 工作分配问题 NOJ 1288 裸KM算法
  20. II——caffe+ubuntu14.04 64bit+cuda6.5配置说明——补充

热门文章

  1. 学妹问我Java枚举类与注解,我直接用这个搞定她!
  2. 在鹅厂,我作为一个Java 程序员每天都在摸鱼!!!
  3. java io流 教程_Java基础教程:IO流与文件基础
  4. levedb 导入 mysql_LevelDB-初始篇
  5. 移动端h5唤起键盘_移动端H5界面打开后,如何自动调用软键盘
  6. 内存和显存_【硬件资讯】显存再升级?Nvidia新卡实锤GDDR6X!显存大升级能否带来性能提升??...
  7. c语言中文件如何插入数据,急求如何将下列C语言程序数据存储到文件中?
  8. oracle类似isempty,NULLs和empty strings在不同数据库的中特点
  9. 台电x80plus装linux,纤巧却不简单——台电X80 Plus评测
  10. [Java基础]数据输入