链接
题意:
给出n个数,可以进行最多N次操作,
- 选取i,j,k不相等,使得
变成
分析:
首先我们看每次进行一次操作会变成什么?
- N为奇数:
- 选择三个数互不相同,全部变成一个数,
- 选择三个数其中两个数相等,那么变成第三个数。
知道这些之后我们就能得出可以先通过第一种操作,使得变成两两相同的数,然后我们再通过第二种操作使得所有数相同。
- N为偶数
我们知道偶数的话,进行一次操作后,异或和是不会变的,那么如果异或和为0,那么我们可以直接去掉一个数,然后剩下奇数个数采取上面的方法。为什么可以那?因为假设取出的数是X,那么另外的数异或和一定是X,那么最后变成的数都是X。
如果异或和不是0那么就没办法了。无解
ll a[maxn],n,sum;
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],sum^=a[i];
if(!(n&1)){
n--;
if(sum){
puts("NO");
return;
}
}
puts("YES");
printf("%lld\n",n-2);
for(ll i=1;i+2<=n;i+=2) printf("%lld %lld %lld\n",i,i+1,i+2);
for(ll i=1;i+1<=n-3;i+=2) printf("%lld %lld %lld\n",i,i+1,n);
}