题解 CF1594F Ideal Farm
或许更好的阅读体验(?
很神奇的贪心。我们要做的其实是尽量构造一个序列,使得其不存在一个和为
先转为最多能选多少个空隙,显然位置膜
综上,我们把原问题等价转化为了若干条独立的数轴上选最多的不相邻的点(实际上就是链最大独立集),给出了最优决策并证明了其正确性。现在来计算答案:如果第
题外话:很多人的构造策略可能是先放
代码如下(码字不易,点个赞再走好不好QAQ):
#include<bits/stdc++.h>
#define fo(i,x,y) for(int i=x;i<=y;++i)
#define go(i,x,y) for(int i=x;i>=y;--i)
#define sml(x,y) x=min(x,y)
#define big(x,y) x=max(x,y)
#define mk make_pair
#define pb push_back
#define ll long long
#define db double
#define int ll
using namespace std;
inline void out(int *a,int l,int r){fo(i,l,r) printf("%d ",*(a+i));puts("");}
inline int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar(); } while(isdigit(ch)){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; }
signed main(){
int T=read();
while(T--){
int s=read(),n=read(),k=read();//s/k:数轴长度
if(s==k) puts("Yes");
else{
int x;
if(s/k&1) x=k*(s/k+1)/2;
else x=(s%k+1)*(s/k/2+1)+(k-s%k-1)*(s/k/2);
puts(x>n?"No":"Yes");
}
//else if(n/k*k*2+n%k<=s) puts("No");
//else puts("Yes");
}
return 0;
}
/*
5
1 1 1
1 1 2
100 50 200
56220 47258 14497
87077 86130 86130
-------------------------
Y
N
N
Y
Y
*/