CF1438D Powerful Ksenia
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相关推荐
- 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 ...
- 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 ...
- 牛客网-数据结构笔试题目(四)-Powerful Ksenia问题解决方案(附源码)
题意 现在我们想要在n步这样的神奇异或操作之内让数组当中的所有元素全部相等,请问这一点是否可能呢?首先输出YES或NO,表示是否有解.如果有解输出需要操作的步数,以及对应选择的元素下标. 样例 在第一 ...
- 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[ ...
- CF 绿蓝题做题记录
CF 绿蓝题做题记录 题单 最近有在经常随机一些 CF 绿蓝难度的题目,用于提升思维.这里专门开个坑,记录一下思路障碍经验什么的. 自然这些内容也在每天本来的做题记录中就有记录,只不过这里只是把它集合 ...
- codeforces round div2,3周赛补题计划(从开学到期末)
1. 本学期场次 从2020.09.19-2021.01.18,一共18周. 题号 场次 日期 备注 1475 Codeforces Round #697 (Div. 3) 1.25 1474 Cod ...
- Codeforces Round #682 (Div. 2)
文章目录 Codeforces Round #682 (Div. 2) A. Specific Tastes of Andre B. Valerii Against Everyone C. Engin ...
- CodeForces 86 D Powerful array 莫队
Powerful array 题意:求区间[l, r] 内的数的出现次数的平方 * 该数字. 题解:莫队离线操作, 然后加减位置的时候直接修改答案就好了. 这个题目中发现了一个很神奇的事情,本来数组开 ...
- The powerful Android Studio
英文来源: The powerful Android Studio 作者: Saúl Molinero(@saulmm),感谢作者对本篇文章的翻译授权. 译者: D_clock爱吃葱花 校对: 汤涛( ...
最新文章
- 07-主队列和全局队列
- 7个IntelliJ IDEA必备插件,让写代码像火箭一样飞起!
- 全面分析Web应用程序安全漏洞——《黑客攻防技术宝典:web实战篇》
- 清华大学 pip 源
- Linux常用性能分析工具汇总
- hook java_Java 实现 Hook 对鼠标键盘监听 - 沐早'S NOTEBOOK - CSDN博客
- [Domino]Java访问Domino必需配置的服务器设置
- sendkeys鼠标点击_selenium操作详解之鼠标键盘事件
- python寻找字符串中的英文字符,python如何解析字符串中出现的英文人名?
- JAVA数组扁平化整合_5种方法实现数组扁平化
- Linux脚本验证的常见方法,linux shell常用循环与判断语句(for,while,until,if)使用方法...
- Ecipse:calculating requirements and dependencies(长时间阻塞问题)
- Windows应用商店下载安装Ubuntu
- 【热门主题:银魂win7主题】
- PHP redis 清空 整个哈希hash表信息
- 网络模型早停earlystopping详解
- Xshell上传文件的方法和在docker打开lrzsz
- 躺平国历险记:两个超平面之间距离的计算
- L13. hrtimer使用实例(高精度定时器)
- 30天自制操作系统 第一天