agc016D - XOR Replace(图论 智商)
题意
给出两个长度为\(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(图论 智商)的更多相关文章
- AGC016D - XOR Replace 置换/轮换
目录 题目链接 题解 代码 题目链接 AGC016D - XOR Replace 题解 可以发现一次操作相当于一次置换 对于每个a上的位置映射到b对应 可以找到置换群中的 所有轮换 一个k个元素的轮换 ...
- 【做题】agc016d - XOR Replace——序列置换&环
原文链接 https://www.cnblogs.com/cly-none/p/9813163.html 题意:给出初始序列\(a\)和目标序列\(b\),都有\(n\)个元素.每次操作可以把\(a\ ...
- [agc016d]xor replace
题意: 题解: 棒棒的神仙题...这题只是D题???(myh:看题五分钟,讨论两小时) 首先这个异或和是假的,比如我现在有$a=(a_1,a_2,a_3,a_4)$,操作一下$a_2$,就变成了$a= ...
- AGC 16 D - XOR Replace
AGC 16 D - XOR Replace 附上attack(自为风月马前卒爷) 的题解 Problem Statement There is a sequence of length N: a=( ...
- 【agc016D】XOR Replace
Portal --> agc016D Description 一个序列,一次操作将某个位置变成整个序列的异或和,现在给定一个目标序列,问最少几步可以得到目标序列 Solution 翀 ...
- AtcoderGrandContest 016 D.XOR Replace
$ >AtcoderGrandContest \space 016 D.XOR\space Replace<$ 题目大意 : 有两个长度为 \(n\) 的数组 \(A, B\) ,每次操作 ...
- TTTTTTTTTTTTTTTTTTT CF 银行转账 图论 智商题
C. Money Transfers time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Agc016_D XOR Replace
传送门 题目大意 给定两个长为$n$的序列$A,B$你可以进行若干组操作,每次操作选定一各位置$x$,令$A_x$等于$A$的异或和. 问能否通过一定操作使得$A$成为$B$,如果能,求最小操作书数. ...
- Atcoder D - XOR Replace(思维)
题目链接:http://agc016.contest.atcoder.jp/tasks/agc016_d 题解:稍微想一下就知道除了第一次的x是所有的异或值,之后的x都是原先被替换掉的a[i]所以要想 ...
随机推荐
- 【Winform】.cs文件命名空间排序及注释批量处理工具
公司里每个程序员在命名空间的排序和注释上都有很多的不同. 杂乱的命名空间: using System; using System.Collections.Generic; using Autodesk ...
- BZOJ4311:向量——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4311 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 ...
- angularJS前端分页插件
首先在项目中引入 分页插件的 js 和 css: 在html页面引入 相关js 和 css: 在控制器中引入分页插件中定义的 module[可以打开pagination.js查看,可以看到 其实,在插 ...
- SFM
1.相机模型,内参数和外参数矩阵,相机标定: 2.极线约束和本征矩阵:特征点提取与匹配:提取到的特征点计算本征矩阵(五对以上的点)findEssentialMat(),需啊要点对,焦距参数,cx,cy ...
- 【题解】Weird journey Codeforces 788B 欧拉路
传送门:http://codeforces.com/contest/788/problem/B 好题!好题! 首先图不连通的时候肯定答案是0,我们下面讨论图联通的情况 首先考虑,如果我们每条边都经过两 ...
- ACM.hdu1025
to get the ans of how many roads at most that can be built between two line without intersection of ...
- Inner join case when
SELECT ( ), wn.ActualWorkflowNumber) + ' ' + wi.SN ) AS SN , wi.RecordID , wi.WorkflowName , wc.Work ...
- http学习 - 缓存
对缓存的理解更加深刻,缓存有一个过期时间,现在用的比较多的是 max-age,以前使用 expirt之类的, 然后就是需要向服务器验证是否是最新的,如果不是最新的则需要更新.
- [Luogu 2146] NOI2015 软件包管理器
[Luogu 2146] NOI2015 软件包管理器 树剖好题. 通过对题目的分析发现,这些软件构成一棵树,\(0\) 是树根. 每下载一个软件,需要下载根到这个软件的路径上的所有软件: 每卸载一个 ...
- ? 初识Webx 2
初识Webx 1: http://www.cnblogs.com/lddbupt/p/5547189.html Webx Framework负责完成一系列基础性的任务. 比如系统初始化和响应请求. 系 ...