poj 2373 dp单调队列优化

点击打开链接

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int M = 1001000;
const long inf=1<<30;
int n,l,a,b,flag[M]; // flag[i] =1 i点有解 
int q[M],p[M]; //单调队列,下标 
int head=1,tail=0;
int dp[M];// 正好cover 0~x的sprinkler的最少数量 
 // 对最后一个sprinkler做决策 dp[i]= 1+ min(dp[j])  i-2b<=j<=i-2a 



//Farmer John needs to water the entire ridge in a manner that covers each location on the ridge by exactly one 
//每个sprinkler覆盖范围为 2*r 不能交叉 所以每一断都为even 
	
//if(cow[i])// Each of the cow's preferred ranges must be watered by a single sprinkler
// 每个区间只能被一个Sprinkler覆盖 
void insert(int index)
{
	
	while(tail>=head && dp[index]<=q[tail] && flag[index])
	{
		tail--;
	}
	q[++tail]=dp[index]; 
	p[tail]=index;
}
int main()
{
	
	cin>>n>>l>>a>>b;
	for(int i=0;i<=l;i++)
	{
		dp[i]=inf; // 先都初始化为inf
		flag[i]=1;
	}
	for(int i=1;i<=n;i++)
	{
		int s,e;
		cin>>s>>e;
		for(int j=s+1;j<=e-1;j++) // 闭区间
		{
			flag[j]=0; //cow[j] cow可以在j点活动 
		} 
	}
	dp[0]=0; 
	for(int i=2*a;i<=l;i+=2)
	{
	 
		insert(i-2*a);  // 保证单调队列有下标满足 
		if(!flag[i])
		continue; // 初始化时已经处理过了 
	

		while(head<=tail&&p[head]<i-2*b) 
		{
			head++;	
		}
		dp[i]=q[head]+1;	
	}
	
	
	
	
	if(dp[l]>=inf)
	cout<<-1<<endl;
	else
	{
		cout<<dp[l]<<endl;
	}
	return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值