题目大意
n个数,划分成k段,每一段的和为奇数,问是否存在方案?
题解
奇+奇=偶
奇+偶=奇
偶+偶=偶
假设有ans个奇数
我们先保证有ans>=k,则我们先选出k-1个奇数,剩下的奇数个数ans-k+1必须是奇数个,所有偶数可以看成一个偶数就行
这道题如果对数论熟悉点的就会想到这个只和奇数个数和分块有关
且当ans%2==k%2时才能分块(即同奇或同偶才能进行分块)
最后注意输出的是右边界所以这里k需要提前减1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e6+10;
ll a[maxn];
int t,n,k;
int main(){
scanf("%d",&t);
while(t--){
int ans=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
if(a[i]&1) ++ans;
}
if(ans%2==k%2&&ans>=k){
printf("YES\n");
--k;
for(int i=1;i<=n&&k;i++){
if(a[i]&1){
printf("%d ",i);
--k;
}
}
printf("%d\n",n);
}else
printf("NO\n");
}
return 0;
}
学如逆水行舟,不进则退