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;
}
posted @ 2025-09-12 08:09  FormulaOne  阅读(6)  评论(0)    收藏  举报