$ >AtcoderGrandContest \space\ 016\ D.XOR\space Replace<$

题目大意 :

有两个长度为 \(n\) 的数组 \(A, B\) ,每次操作将 \(A\) 中的一个元素替换为 \(A\) 中所有元素的异或和,求最少几次操作可以从 \(A\) 变换到 \(B\) 。

\(1 \leq n \leq 10^5\)

解题思路 :

设初始状态的异或和为 \(S\) ,第一次替换掉的数为 \(x\) ,容易发现新的数列的异或和为 \(x\) ,可以简单证明每一次的异或和等于上一次被替换的数。

那么问题就转化为对于一个序列 \(A\) ,\(A_{n+1} = S\) ,第一次取出 \(S\) ,之后每一次替换掉某个数并取出它来替换别人,事实上每一个取出的数都会被放到其在 \(B\) 中的位置上。

此时 \(A\) 数组就构成了若干个置换,最小花费就是置换的数量加上环上的点数 \(-1\) ,但是一个数可能会有多个合法的位置可以选,直接构造的话置换的数量可能不会优。

但是观察发现如果两个置换存在数值相等的位置,那么可以通过交换 \(next\) 指针变成一个置换,所以只需要按照数值来合并联通块就能求出置换的最小数量,可以用并查集来维护。

/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int f = 0, ch = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int N = 1000005;
map<int, int> id;
int fa[N], s1[N], s2[N], a[N], b[N], n, col, ans;
inline int ask(int x){ return x == fa[x] ? x : fa[x] = ask(fa[x]); }
inline void merge(int x, int y){
int p = ask(x), q = ask(y); if(p != q) fa[p] = q;
}
signed main(){
read(n);
for(int i = 1; i <= n; i++) read(a[i]), a[n+1] ^= a[i];
for(int i = 1; i <= n; i++) read(b[i]), b[n+1] ^= b[i];
for(int i = 1; i <= n + 1; i++) s1[i] = a[i], s2[i] = b[i];
sort(s1 + 1, s1 + n + 2), sort(s2 + 1, s2 + n + 2);
for(int i = 1; i <= n + 1; i++) if(s1[i] != s2[i]) return puts("-1"), 0;
for(int i = 1; i <= n; i++) if(a[i] != b[i]) ans++;
for(int i = 1; i <= n + 1; i++) fa[i] = i;
for(int i = 1; i <= n + 1; i++) if(a[i] != b[i]){
if(!id[a[i]]) id[a[i]] = ++col;
if(!id[b[i]]) id[b[i]] = ++col;
merge(id[a[i]], id[b[i]]);
}
if(!id[a[n+1]]) id[a[n+1]] = ++col;
if(!id[b[n+1]]) id[b[n+1]] = ++col;
for(int i = 1; i <= col; i++) if(fa[i] == i) ans++;
cout << ans - 1;
return 0;
}

AtcoderGrandContest 016 D.XOR Replace的更多相关文章

  1. AGC016D - XOR Replace 置换/轮换

    目录 题目链接 题解 代码 题目链接 AGC016D - XOR Replace 题解 可以发现一次操作相当于一次置换 对于每个a上的位置映射到b对应 可以找到置换群中的 所有轮换 一个k个元素的轮换 ...

  2. AGC 16 D - XOR Replace

    AGC 16 D - XOR Replace 附上attack(自为风月马前卒爷) 的题解 Problem Statement There is a sequence of length N: a=( ...

  3. agc016D - XOR Replace(图论 智商)

    题意 题目链接 给出两个长度为\(n\)的数组\(a, b\) 每次可以将\(a\)中的某个数替换为所有数\(xor\)之和. 若\(a\)数组可以转换为\(b\)数组,输出最少操作次数 否则输出\( ...

  4. 【做题】agc016d - XOR Replace——序列置换&环

    原文链接 https://www.cnblogs.com/cly-none/p/9813163.html 题意:给出初始序列\(a\)和目标序列\(b\),都有\(n\)个元素.每次操作可以把\(a\ ...

  5. 【agc016D】XOR Replace

    Portal --> agc016D Description ​ 一个序列,一次操作将某个位置变成整个序列的异或和,现在给定一个目标序列,问最少几步可以得到目标序列 ​ Solution ​ 翀 ...

  6. Agc016_D XOR Replace

    传送门 题目大意 给定两个长为$n$的序列$A,B$你可以进行若干组操作,每次操作选定一各位置$x$,令$A_x$等于$A$的异或和. 问能否通过一定操作使得$A$成为$B$,如果能,求最小操作书数. ...

  7. [agc016d]xor replace

    题意: 题解: 棒棒的神仙题...这题只是D题???(myh:看题五分钟,讨论两小时) 首先这个异或和是假的,比如我现在有$a=(a_1,a_2,a_3,a_4)$,操作一下$a_2$,就变成了$a= ...

  8. Atcoder D - XOR Replace(思维)

    题目链接:http://agc016.contest.atcoder.jp/tasks/agc016_d 题解:稍微想一下就知道除了第一次的x是所有的异或值,之后的x都是原先被替换掉的a[i]所以要想 ...

  9. 【AtCoder】AGC016

    A - Shrinking 用每个字母模拟一下就行 #include <bits/stdc++.h> #define fi first #define se second #define ...

随机推荐

  1. LintCode 510: Maximal Rectangle

    LintCode 510: Maximal Rectangle 题目描述 给你一个二维矩阵,权值为False和True,找到一个最大的矩形,使得里面的值全部为True,输出它的面积 Wed Nov 2 ...

  2. 探讨一个“无法创建JVM”的问题(已解决)

    ava版本:1.4 运行设置: -Xms1G -Xmx4G 报错: [ Incompatible initial and maximum heap sizes specified: ][ initia ...

  3. 【洛谷 P2764】 最小路径覆盖问题(最大流)

    题目链接 首先有\(n\)条路径,每条路径就是一个点,然后尽量合并,答案就是点数-合并数. 套路拆点,源连入,出连汇,原有的边入出连. 最大流就是最大合并数,第一问解决. 然后怎么输出方案? 我是找到 ...

  4. 【leetcode 简单】第五题 最长公共前缀

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  5. 打表找规律C - Insertion Sort Gym - 101955C

    题目链接:https://cn.vjudge.net/contest/273377#problem/C 给你 n,m,k. 这个题的意思是给你n个数,在对前m项的基础上排序的情况下,问你满足递增子序列 ...

  6. javascript中的数组去重

    1.方法一:双层循环,外层循环元素,内层循环做比较,若相同则跳过,不同则加入结果集中,获取没重复的最右侧的值放入数组中 Array.prototype.distinct = function(){ v ...

  7. ogg数据初始化历程记录

    之前,源端数据表结构发生改变,不知道前面的同事是怎么搞得(生成的数据定义文件不对,还是没有把进程启动),造成进程停止20天,然后重启复制进程,对比源端和目标端数据有差异(总共差10000多条数据),问 ...

  8. i春秋第二届春秋欢乐赛RSA256writeup

    i春秋第二届春秋欢乐赛writeup 下载之后进行解压 发现四个文件 0x01看到题目是RSA的  又看到public.key 所以直接用kali linux的openssl 0x02可以看到e就是E ...

  9. imperva agent 的重新注册

    情况是这样 公司搭了一个环境有mysql的数据库并且安装了agent,imperva管理平台上也可以看到agent的注册信息,但是没想到的是有人把我的虚机给还原快照了,而且还没保存..... 这次写个 ...

  10. NuGet Package Explorer上传时报:failed to process request:'Method Not Allowed'错误解决办法

    相关日志:PUT /api/v2/package - 1000 -  NuGet+Package+Explorer/3.15.0.0+(Microsoft+Windows+NT+6.2.9200.0) ...