#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;
}
07-22
07-22
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交