博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【poj2373】Dividing the Path【单调队列优化dp】
阅读量:5103 次
发布时间:2019-06-13

本文共 1203 字,大约阅读时间需要 4 分钟。

题解:
对于每一个必须用同一个喷头覆盖的区间[s,e],把s+1,e-1覆盖一下。如果某个位置i被覆盖过了,它就一定不能作为一个喷头覆盖的右端点。
让f[i]表示覆盖0..i的最小喷头数量。
dp方程:
   infinf i当i被覆盖了
f[i]=f[i]=
   min{
f[i2a],f[i2a2]..f[i2b]}
+1
min{f[i−2∗a],f[i−2∗a−2]..f[i−2∗b]}+1
 iabi当i没有被覆盖,用半径a到b的以i为右端点覆盖,取最小值
后面的一坨东西直接扔单调队列维护即可。
代码:

#include
const int N=1000005,inf=0x3f3f3f3f;int n,l,a,b,s,e,head,tail,c[N],f[N],q[N];int main(){ scanf("%d%d%d%d",&n,&l,&a,&b); for(int i=1;i<=n;i++){ scanf("%d%d",&s,&e); c[s+1]++; c[e]--; } for(int i=1;i<=l;i++){ c[i]+=c[i-1]; } head=1,tail=0; for(int i=2;i<=l;i+=2){ while(head<=tail&&q[head]
=0){ while(head<=tail&&f[i-2*a]<=f[q[tail]]){ tail--; } q[++tail]=i-2*a; } if(c[i]){ f[i]=inf; }else{ if(head<=tail){ if(f[q[head]]!=inf){ f[i]=f[q[head]]+1; }else{ f[i]=inf; } }else{ f[i]=inf; } } } printf("%d\n",f[l]==inf?-1:f[l]); return 0;}

转载于:https://www.cnblogs.com/2016gdgzoi471/p/9476892.html

你可能感兴趣的文章
宇宙第一开发工具:vs2019 开发Python
查看>>
Tomcat Https配置
查看>>
百度地图 android SDKv2.2.0
查看>>
[贪心][模拟] Jzoj P5811 简单的填数
查看>>
react样式
查看>>
document.body
查看>>
大话存储系列21——存储系统内部IO 上
查看>>
检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法
查看>>
关于mybatis中基本类型条件判断问题
查看>>
RDD之二:原理
查看>>
Struts2.0 xml文件的配置(package,namespace,action)
查看>>
转载:【Oracle 集群】RAC知识图文详细教程(四)--缓存融合技术和主要后台进程
查看>>
2018-2019-2 网络对抗技术 20165301 Exp 9 Web安全基础
查看>>
将20180608141920转成date格式
查看>>
位操作
查看>>
待续--mysql中key 、primary key 、unique key 与index区别
查看>>
Day19内容回顾
查看>>
【bzoj1050】[HAOI2006]旅行comf 并查集
查看>>
Linux CentOS 6.5 操作环境下修改mysql数据库密码
查看>>
WOW
查看>>