それは最後の質問に置かれていますが、それでも比較的水っぽいです。パリティの問題を判断するだけで済みます。
トピック
4種類の文字があり、それぞれに特定の番号があります。
限られた数の操作を実行できます
。l、o、vの3文字を一度に1つずつ削除します(明らかに、3文字すべてがまたはより大きくなければなりません) 1)に等しい場合、3文字を取得します。e。
数回(おそらくゼロ)の操作の後、すべての文字をパリンドロームに配置できますか?
説明を入力してください
最初の行のtは、tグループクエリを意味します
次のt行では、各行に4つの数字があり、文字l、o、v、eの数を示しています。
出力の説明
t行、YESを出力できる場合、NOを出力することはできません
サンプル入力
2
2 3 4 5
2 0 0 1
サンプル出力
いいえ
はい
データ範囲
t <= 10 ^ 5
各文字の数が10 ^ 9以下
回文の性質に応じて、次のように、4文字の数に3つ以上の偶数が必要です(中央の文字は偶数または偶数にすることができます)。
lovevol
loveevol
質問の意味に応じて、l、o、vの3文字を一度に1つずつ削除し、eを3文字追加します。つまり、操作ごとに4文字のパリティを1回変更します。奇数の演算はパリティを変更でき、偶数の演算は変更されません。
各文字の数は0未満にすることはできないため、操作の最大数はl、o、およびvの最小値です。現時点では、残りの3つ(またはそれ以下)のパリティを考慮する必要があるだけです。文字は回文を形成する要件を満たしています文字列の状態。
コード:
#include <iostream>
using namespace std;
int l,o,v,e;
int main(){
int t,min=0;
cin>>t;
int l1,o1,v1,e1;
for(int i=0;i<t;i++){
cin>>l>>o>>v>>e;
if(l>o)
min=o;
else
min=l;
if(min>v)
min=v;
if(min>0){
l1=l%2,o1=o%2,v1=v%2,e1=e%2;
if(l1+o1+v1+e1<=1||l1+o1+v1+e1>=3)
printf("YES\n");
else{
l-=min;
o-=min;
v-=min;
e1+=min%2;
if(e1==2)
e1=0;
l1=l%2,o1=o%2,v1=v%2;
if(l1+o1+v1+e1<=1||l1+o1+v1+e1>=3)
printf("YES\n");
else
printf("NO\n");
}
}
else{
l1=l%2,o1=o%2,v1=v%2,e1=e%2;
if(l1+o1+v1+e1<=1||l1+o1+v1+e1>=3)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}