由于 $d$ 是固定的,考虑移动序列 $d$,判断是否能恰好嵌入到假期里面。
所以把 $d_1$ 放在假期的第一天,那么我们现在可以向右移动 $A-1$ 天。
一周可以表示为 a a b b b b a a
。(a
表示假期,b
表示工作日)
接下来分类讨论输出 Yes
的情况:
-
全部在前面的
a
。 -
部分在前面的
a
,部分在后面的a
。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2e5+100;
int n,a,b,d[N];
bool flag;
int main()
{
scanf("%d%d%d",&n,&a,&b);
for(int i=1;i<=n;i++)
{
scanf("%d",&d[i]);
d[i]%=a+b;
if(!d[i]) d[i]=a+b;
}
sort(d+1,d+n+1);
if(d[n]-d[1]+1<=a) flag=true;
for(int i=2;i<=n;i++)
{
if(d[i]-d[i-1]>b&&d[i-1]<=a) flag=true;
}
flag?printf("Yes"):printf("No");
return 0;
}