ARC198B
首先对于 \(0,1,2\) 可以放的位置有如下事实:
- \(0\) 可以放任何位置。因为没有数比 \(0\) 小。
- \(1\) 必须一侧是 \(0\),另一侧是 \(1\) 或 \(2\)。具体地,只有 \(0,1,2\) 或 \(0,1,1,0\) 两种情形。
- \(2\) 不能连续放置。不连续放置时,两侧的数显然都比 \(2\) 小。
具体地,我们先把所有 \(2\) 放进数列,再往其中插入 \(0\) 和 \(1\)。显然每个 \(2\) 之间至少有 \(1\) 个 \(0\)(否则 \(1\) 无法满足条件),故至少需要 \(Z\) 个 \(0\)。接下来考虑 \(1\) 的限制,为了尽可能的多插入 \(1\),可以按照 \(2,1,0,1,\cdots,1,0,1,2\) 的形式(中间都是 \(1,0,1\)),那么 \(X\) 个 \(0\) 最多插入 \(2X\) 个 \(1\)。于是无解的两种情况:
- \(X<Z\)
- \(2X<Y\)
注意特判 \(X,Y,Z\) 中存在 \(0\) 的情况。
- \(X=0\),显然无解。
- \(Y=0\),判断无解的第一种情况。
- \(Z=0\),判断无解的第二种情况,并且 \(Y\) 为奇数时也是无解的。
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
void solve(){
int a,b,c;
cin>>a>>b>>c;
if(c==0){
if(a*2<b||b%2==1)cout<<"No\n";
else cout<<"Yes\n";
return;
}
if(a==0){
cout<<"No\n";
return;
}
if(a<c||a*2<b){
cout<<"No\n";
return;
}
cout<<"Yes\n";
return;
}
signed main(){
int T;
cin>>T;
while(T--)solve();
return 0;
}

浙公网安备 33010602011771号