POJ 2373 单调队列优化DP
题意:
思路:
f[i] = min(f[j]) + 1; 2 * a <= i - j <= 2 *b;
i表示当前在第i个点。f[i]表示当前最少的线段个数
先是N^2的朴素DP(果断TLE)
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,l,A,B,tot=1,xx,yy,f[1000050];
struct Node{int x,y;}node[1050];
bool cmp(Node a,Node b){if(a.x!=b.x)return a.x<b.x;return a.y<b.y;}
int main()
{
memset(f,0x3f,sizeof(f));
f[0]=0;
scanf("%d%d%d%d",&n,&l,&A,&B);
for(int i=1;i<=n;i++){
scanf("%d%d",&node[i].x,&node[i].y);
}
sort(node+1,node+1+n,cmp);
for(int i=1;i<=l;i++){
while(i>node[tot].x&&tot<n){i=node[tot].y;tot++;}
if(i&1)continue;
for(int j=2*A;j<=2*B;j+=2){
f[i]=min(f[i],f[i-j]+1);
}
}
printf("%d\n",f[l]);
}
下面我们开始想优化…
a和b都是常数,,他要找一个最大值。。
1.线段树优化 (卡时过)
2.单调队列优化
注意插入的时候要等到算f[i+2*a]的时候再把f[i]插到队列里。
(用STL的双端队列写得)
//By SiriusRen
#include <deque>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,l,A,B,tot=1,xx,yy,f[1000050];
struct Node{int x,y;}node[1050],jy;
bool cmp(Node a,Node b){if(a.x!=b.x)return a.x<b.x;return a.y<b.y;}
deque<Node>q;
int main(){
memset(f,0x3f,sizeof(f)),f[0]=0;
scanf("%d%d%d%d",&n,&l,&A,&B);
for(int i=1;i<=n;i++)scanf("%d%d",&node[i].x,&node[i].y);
sort(node+1,node+1+n,cmp);
for(int i=1;i<=n;i++)
for(int j=max(node[i].x+1,node[i-1].y);j<node[i].y;j++)f[j]=0x5fffffff;
for(int i=A*2;i<=l;i+=2){
while(!q.empty()&&q.front().x<i-2*B)q.pop_front();
while(!q.empty()&&q.back().y>f[i-2*A])q.pop_back();
if(f[i-2*A]<0x3ffffff)
jy.x=i-2*A,jy.y=f[i-2*A],q.push_back(jy);
if(f[i]>=0x4fffffff)continue;
if(!q.empty())f[i]=q.front().y+1;
}
if(f[l]<0x3ffffff)printf("%d\n",f[l]);
else puts("-1");
}
POJ 2373 单调队列优化DP的更多相关文章
- POJ - 1821 单调队列优化DP + 部分笔记
题意:n个墙壁m个粉刷匠,每个墙壁至多能被刷一次,每个粉刷匠要么不刷,要么就粉刷包含第Si块的长度不超过Li的连续墙壁(中间可不刷),每一块被刷的墙壁都可获得Pi的利润,求最大利润 避免重复粉刷: 首 ...
- poj 2373 单调队列优化背包
思路:我们用单调队列保存2*b<=i-j<=2*a中的最大值.那么队列头就是最大值,如果队头的标号小于i-2*b的话,就出队,后面的肯定用不到它了. #include<iostrea ...
- poj 1821 Fence 单调队列优化dp
/* poj 1821 n*n*m 暴力*/ #include<iostream> #include<cstdio> #include<cstring> #incl ...
- POJ 1821 Fence(单调队列优化DP)
题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...
- 算法笔记--单调队列优化dp
单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...
- 单调队列优化DP——习题收集
前言 感觉可以用单调队列优化dp的模型还是挺活的,开个随笔记录一些遇到的比较有代表性的模型,断续更新.主要做一个收集整理总结工作. 记录 0x01 POJ - 1821 Fence,比较适合入门的题, ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- hdu3401:单调队列优化dp
第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...
随机推荐
- H2数据库入门使用
H2数据库入门使用 学习了: https://www.cnblogs.com/xdp-gacl/p/4171024.html http://www.cnblogs.com/xdp-gacl/p/417 ...
- javaScript中的事件对象event
事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包括了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的 ...
- kafka 0.11 spark 2.11 streaming例子
""" Counts words in UTF8 encoded, '\n' delimited text received from the network every ...
- Under ubuntu 12.04,install sublime text 2
Sublime Text is an awesome text editor. If you’ve never heard of it, you should check it out right n ...
- 15.boost最小生成树 prim_minimum_spanning_tree
#include <iostream> #include <boost/config.hpp> //图(矩阵实现) #include <boost/graph/adjac ...
- 创建ios界面的三步骤
1.加载数据 (包括懒加载和字典转模型等) 2.搭建界面 (常见的有九宫格算法和for循环的嵌套等) 3.实现用户交互 (通常用按钮实现)
- SpringBoot(二) 主程序详解和配置文件如何配置
SpringBoot主程序详解 /** * @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用 */ @SpringBootApplication ...
- 51nod-1134 最长递增子序列,用线段树将N^2的dp降到NlogN
题目链接 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10. Input 第1行 ...
- 使用dispatch_group来进行线程同步
我的上篇文章iOS中多个网络请求的同步问题总结中用到了dispatch_group来进行线程同步,对用法不是特别熟悉所以整理这篇文章来加深记忆(闲着也是闲着). 一.简单介绍下将会用到的一些东西 英语 ...
- mysql 密码的破解
现在的主流的数据库一般是mysql ,sql server , oracle. 有的时候我们忘记了数据库密码的时候我们要怎么办,破解别人的数据库的密码的时候我们要怎么搞 忘记密码是一件很头痛的 ...