0
点赞
收藏
分享

微信扫一扫

CF1438D Powerful Ksenia (构造+思维+数学)


链接

题意:

给出n个数,可以进行最多N次操作,

  • 选取i,j,k不相等,使得变成

分析:

首先我们看每次进行一次操作会变成什么?

  • N为奇数:
  1. 选择三个数互不相同,全部变成一个数,
  2. 选择三个数其中两个数相等,那么变成第三个数。

知道这些之后我们就能得出可以先通过第一种操作,使得变成两两相同的数,然后我们再通过第二种操作使得所有数相同。

  • 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);
}


举报

相关推荐

0 条评论