题意

题目链接

给出两个长度为\(n\)的数组\(a, b\)

每次可以将\(a\)中的某个数替换为所有数\(xor\)之和。

若\(a\)数组可以转换为\(b\)数组,输出最少操作次数

否则输出\(-1\)

Sol

一般那看到这种\(N \leqslant 10^5\)而且不可做的题肯定是先找结论啦

不难看出,我们把所有数\(xor\)起来的数替换掉之后再次\(xor\),得到的一定是被替换掉的数。

实际上,我们可以把xor出来的数放到一个新的位置\(N+1\),这样每次操作就变成了交换第\(N+1\)个位置的数和任意一个位置\(x\)的数

总的问题就变成了

给出两个长度为\(N+1\)的数组\(a, b\),每次可以在\(a\)中交换\(\forall i \in [1, n]\)位置和\(N+1\)位置的数,问最少交换几次变为\(b\)数组

首先把\(-1\)的情况判掉,很显然,把两个数组排序后,若存在一个位置不相同,则一定无解

否则一定有解。

到这里我就不会了。。。。

官方题解非常神仙。

对于\(i\)位置,若\(a_i \not = b_i\),则向\(a_i\)到\(b_i\)连一条边

最终答案 = 总边数 + 联通块数 - 1

想一想为什么,对于联通块内的点,假设其大小为\(x\),我们一定可以通过\(x-1\)次操作把他们对应的\(a\)和\(b\)变的相同

对于不同联通块之间,我们还需要一步操作使得第\(N+1\)个位置的数在两个联通块之间转化(第一个除外)

对于第\(N+1\)个位置需要单独考虑:如果它已经在联通块里则不需要考虑,否则把它看做单独联通块

否则

2
1 3
3 1

可以用并查集维护联通块个数

#include<bits/stdc++.h>
const int MAXN = 4e5 + 10;
using namespace std;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N;
int a[MAXN], b[MAXN], ta[MAXN], tb[MAXN], sa, sb, tot = 0, date[MAXN], fa[MAXN];
map<int, bool> ti;
int find(int x) {
return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}
int unionn(int x, int y) {
fa[x] = y;
}
int main() {
N = read();
for(int i = 1; i <= N; i++) a[i] = read(), sa ^= a[i]; a[N + 1] = sa;
for(int i = 1; i <= N; i++) b[i] = read(), sb ^= b[i]; b[N + 1] = sb;
N++;
memcpy(ta, a, sizeof(a)); memcpy(tb, b, sizeof(b));
sort(ta + 1, ta + N + 1); sort(tb + 1, tb + N + 1);
for(int i = 1; i <= N - 1; i++) if(ta[i] != tb[i]) return puts("-1"), 0; int ans = 0, num = 0;
for(int i = 1; i <= N; i++)
if(a[i] != b[i] || (i == N)) {
date[++num] = a[i]; date[++num] = b[i];
if(i < N)ans++;//最后一块单独考虑
}
if(ans == 0) return puts("0"), 0; sort(date + 1, date + num + 1);
num = unique(date + 1, date + num + 1) - date - 1;
for(int i = 1; i <= num; i++) fa[i] = i;
for(int i = 1; i <= N; i++)
if(a[i] != b[i]) {
a[i] = lower_bound(date + 1, date + num + 1, a[i]) - date,
b[i] = lower_bound(date + 1, date + num + 1, b[i]) - date;
if(!ti[a[i]]) ti[a[i]] = 1;
if(!ti[b[i]]) ti[b[i]] = 1;
unionn(find(a[i]), find(b[i]));
} for(int i = 1; i <= num; i++)
if(fa[i] == i) ans++;
printf("%d", ans - 1); return 0;
}

agc016D - XOR Replace(图论 智商)的更多相关文章

  1. AGC016D - XOR Replace 置换/轮换

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

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

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

  3. [agc016d]xor replace

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

  4. AGC 16 D - XOR Replace

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

  5. 【agc016D】XOR Replace

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

  6. AtcoderGrandContest 016 D.XOR Replace

    $ >AtcoderGrandContest \space 016 D.XOR\space Replace<$ 题目大意 : 有两个长度为 \(n\) 的数组 \(A, B\) ,每次操作 ...

  7. TTTTTTTTTTTTTTTTTTT CF 银行转账 图论 智商题

    C. Money Transfers time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  8. Agc016_D XOR Replace

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

  9. Atcoder D - XOR Replace(思维)

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

随机推荐

  1. Spring-Boot基于配置按条件装Bean

    背景 同一个接口有多种实现,项目启动时按某种规则来选择性的启用其中一种实现,再具体一点,比如Controller初始化的时候,根据配置文件的指定的实现类前缀,来记载具体Service,不同Servic ...

  2. UVA.129 Krypton Factor (搜索+暴力)

    UVA.129 Krypton Factor (搜索+暴力) 题意分析 搜索的策略是:优先找长串,若长串不合法,则回溯,继续找到合法串,直到找到所求合法串的编号,输出即可. 注意的地方就是合法串的判断 ...

  3. IDEA_MyBatis_SQLException:Parameter index out of range坑

    报错信息:超出数据库数据表设定的规定长度了 nested exception is org.apache.ibatis.type.TypeException: Could not set parame ...

  4. ES6箭头函数总结

    1. 箭头函数基本形式 let func = (num) => num; let func = () => num; let sum = (num1,num2) => num1 + ...

  5. 深入JavaScript对象创建的细节

    最近深入学习javascript后,有个体会:面向对象的方式编程才是高效灵活的编程,也是现在唯一可以让代码更加健壮的编程方式.如果我们抛开那些玄乎的抽象出类等等思想,我自己对面向对象的从写程序的角度理 ...

  6. XML 树结构,语法规则,元素,属性,验证及其解析

    XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶". 一个 XML 文档实例 XML 文档使用简单的具有自我描述性的语法: <?xml v ...

  7. 关于string::size_type

    size_type其实是string模板类定义的一种类型之一,它与size_of的用法相似,只是它根据存储的类型返回字符串的长度.对于 string具体化,将根据char返回字符串的长度,在这种情况下 ...

  8. VC使用sqlite

    SQLite可以到官方站点(http://www.sqlite.org/download.html)下载:Linux,Mac OS X, Windows下的已编译文件以及源代码.帮助文档. SQLit ...

  9. bzoj 1189 [HNOI2007]紧急疏散evacuate 二分+网络流

    [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3626  Solved: 1059[Submit][St ...

  10. wamp环境介绍

    一.简介 Wamp就是 Windows Apache Mysql PHP集成安装环境,即在window下的apache.php和mysql的服务器软件. 二.常用的集成环境 XAMPP - XAMPP ...