Description

  • 给你一个数组aaa,大小为nnn,每一次可以选择一个三元组(i,j,k)(i≠j≠k)(i,j,k)(i\neq j\neq k)(i,j,k)(i​=j​=k),然后将ai,aj,aka_i,a_j,a_kai​,aj​,ak​赋值为aixorajxoraka_i\ xor\ a_j\ xor\ a_kai​ xor aj​ xor ak​
  • 求一个方案使得在nnn步之内将使得aia_iai​全部相同,不行输出NO。
  • n≤1e5n\le1e5n≤1e5

Solution

  • 一道巧妙的构造题。一开始在想最优策略,没有去大胆地试一试构造的方案,寻找一个通解。
  • 实际上这一类的题目如果不是很难的话,多半都是在某个很特殊的情况下必定可行,只需要先找一个可行解,然后再优化它就好了。
  • 有了这个总体的思路,我们不妨直接考虑一种特殊情况:如果已经有ai=aja_i=a_jai​=aj​,选择(i,j,k)(i,j,k)(i,j,k)相当于是将ai,aja_i,a_jai​,aj​赋值为aka_kak​。
  • 因此我们可以先将若干个数变得相同,然后再将它们作为i,ji,ji,j,变为kkk。注意到一定是一对一对的,所以可以对于所有(2i+1,2i+2,2i+3)(2i+1,2i+2,2i+3)(2i+1,2i+2,2i+3)按顺序做,然后再做(2i+1,2i+2,n)(2i+1,2i+2,n)(2i+1,2i+2,n)即可。
  • 这样只要是奇数是一定能够分完1到n−1n-1n−1的,如果是偶数,注意到最终状态异或和为0,而每一次操作都不会改变异或和,因此我们只需要把它当做奇数来做,有n−1n-1n−1个相同,剩下那个也一定相同。
  • 操作数根据奇偶性略小于nnn
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 100005
using namespace std;int n,i,j,k,a[maxn],tot,ans[maxn][3];void add(int i,int j,int k){tot++,ans[tot][0]=i,ans[tot][1]=j,ans[tot][2]=k;int s=a[i]^a[j]^a[k];a[i]=a[j]=a[k]=s;
}int main(){freopen("ceshi.in","r",stdin);scanf("%d",&n);for(i=1;i<=n;i++) scanf("%d",&a[i]);if (n&1){for(i=1;i+2<=n;i+=2) add(i,i+1,i+2);for(i=1;i+2<n;i+=2) add(i,i+1,n);printf("YES\n%d\n",tot);for(i=2;i<=n;i++) if (a[i]!=a[i-1])printf("!!");for(i=1;i<=tot;i++) printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]);} else {for(i=1;i<=n;i++) k^=a[i];if (k) {printf("NO\n");return 0;}for(i=1;i+2<=n;i+=2) add(i,i+1,i+2);for(i=1;i+2<=n;i+=2) add(i,i+1,n);printf("YES\n%d\n",tot);for(i=2;i<=n;i++) if (a[i]!=a[i-1]) printf("!!");for(i=1;i<=tot;i++) printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]);}
}

CF1438D Powerful Ksenia相关推荐

  1. Codeforces Round #682 (Div. 2)D Powerful Ksenia ///思维

    cf地址 题目大意:Ksenia has an array a consisting of n positive integers a1,a2,-,an. In one operation she c ...

  2. CF 1438 D. Powerful Ksenia

    Ksenia has an array a consisting of n positive integers a1,a2,-,an. In one operation she can do the ...

  3. 牛客网-数据结构笔试题目(四)-Powerful Ksenia问题解决方案(附源码)

    题意 现在我们想要在n步这样的神奇异或操作之内让数组当中的所有元素全部相等,请问这一点是否可能呢?首先输出YES或NO,表示是否有解.如果有解输出需要操作的步数,以及对应选择的元素下标. 样例 在第一 ...

  4. codeforces1438D Powerful Ksenia

    https://codeforces.com/contest/1438/problem/D 奇数一定可以构造出来 1 2 3 ,3 4 5 ,5 6 7这样,最后就是a[1]=a[2],a[3]=a[ ...

  5. CF 绿蓝题做题记录

    CF 绿蓝题做题记录 题单 最近有在经常随机一些 CF 绿蓝难度的题目,用于提升思维.这里专门开个坑,记录一下思路障碍经验什么的. 自然这些内容也在每天本来的做题记录中就有记录,只不过这里只是把它集合 ...

  6. codeforces round div2,3周赛补题计划(从开学到期末)

    1. 本学期场次 从2020.09.19-2021.01.18,一共18周. 题号 场次 日期 备注 1475 Codeforces Round #697 (Div. 3) 1.25 1474 Cod ...

  7. Codeforces Round #682 (Div. 2)

    文章目录 Codeforces Round #682 (Div. 2) A. Specific Tastes of Andre B. Valerii Against Everyone C. Engin ...

  8. CodeForces 86 D Powerful array 莫队

    Powerful array 题意:求区间[l, r] 内的数的出现次数的平方 * 该数字. 题解:莫队离线操作, 然后加减位置的时候直接修改答案就好了. 这个题目中发现了一个很神奇的事情,本来数组开 ...

  9. The powerful Android Studio

    英文来源: The powerful Android Studio 作者: Saúl Molinero(@saulmm),感谢作者对本篇文章的翻译授权. 译者: D_clock爱吃葱花 校对: 汤涛( ...

最新文章

  1. 07-主队列和全局队列
  2. 7个IntelliJ IDEA必备插件,让写代码像火箭一样飞起!
  3. 全面分析Web应用程序安全漏洞——《黑客攻防技术宝典:web实战篇》
  4. 清华大学 pip 源
  5. Linux常用性能分析工具汇总
  6. hook java_Java 实现 Hook 对鼠标键盘监听 - 沐早'S NOTEBOOK - CSDN博客
  7. [Domino]Java访问Domino必需配置的服务器设置
  8. sendkeys鼠标点击_selenium操作详解之鼠标键盘事件
  9. python寻找字符串中的英文字符,python如何解析字符串中出现的英文人名?
  10. JAVA数组扁平化整合_5种方法实现数组扁平化
  11. Linux脚本验证的常见方法,linux shell常用循环与判断语句(for,while,until,if)使用方法...
  12. Ecipse:calculating requirements and dependencies(长时间阻塞问题)
  13. Windows应用商店下载安装Ubuntu
  14. 【热门主题:银魂win7主题】
  15. PHP redis 清空 整个哈希hash表信息
  16. 网络模型早停earlystopping详解
  17. Xshell上传文件的方法和在docker打开lrzsz
  18. 躺平国历险记:两个超平面之间距离的计算
  19. L13. hrtimer使用实例(高精度定时器)
  20. 30天自制操作系统 第一天

热门文章

  1. 【学习笔记】彻底删除2345输入法
  2. ACC-C++组初赛
  3. Java進階:ExecutorService 線程池
  4. canvas练习笔记之手绘熊本熊
  5. ROS的四种通信架构
  6. 在浏览器中使用百度地图的定位服务获得经纬度
  7. 一个小白对接电子面单的哪些坑?
  8. (VC++2013)MFC自绘圆形按钮
  9. 用手机来支付什么-在什么场合用手机支付
  10. 电脑开机时按F几重装系统