Atcoder D - XOR Replace(思维)
题目链接:http://agc016.contest.atcoder.jp/tasks/agc016_d
题解:稍微想一下就知道除了第一次的x是所有的异或值,之后的x都是原先被替换掉的a[i]所以要想可以通过操作得到必须使a[i]里的所有数b[j]里都有
而且数量相同,(a[0]=a[1]^a[2]^..^a[n],b[0]=b[1]^b[2]^..^b[n])。然后就是怎么交换能够使得操作数最少,其实可以用并查集,但是用dfs比较好理解
一点其实都是一样的。显然f[a[i]]=b[i],于是如果a[i]!=b[i]就可以把a[i]-b[i]连起来然后dfs一遍肯定能在a[i]结束。最后找一下规律就行。注意i=0链接
时候的贡献是不需要的。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int M = 1e5 + 10;
int a[M] , b[M] , ha[M] , hb[M];
bool vis[M] , have[M];
vector<int>vc[M];
void dfs(int u) {
vis[u] = true;
int len = vc[u].size();
for(int i = 0 ; i < len ; i++) {
int v = vc[u][i];
if(vis[v]) continue;
dfs(v);
}
}
int main() {
int n;
cin >> n;
a[0] = 0;
for(int i = 1 ; i <= n ; i++) {
cin >> a[i];
a[0] ^= a[i];
ha[i] = a[i];
}
ha[0] = a[0];
b[0] = 0;
for(int i = 1 ; i <= n ; i++) {
cin >> b[i];
b[0] ^= b[i];
hb[i] = b[i];
}
hb[0] = b[0];
sort(ha , ha + n + 1);
sort(hb , hb + n + 1);
for(int i = 0 ; i <= n ; i++) {
if(ha[i] != hb[i]) {
cout << -1 << endl;
return 0;
}//这里是判断能否通过操作得到。
}
for(int i = 0 ; i <= n ; i++) {
a[i] = lower_bound(ha , ha + 1 + n , a[i]) - ha;
b[i] = lower_bound(hb , hb + 1 + n , b[i]) - hb;
}//离散一下由于a[i],b[i]太大了。当然用map就不用这样操作了。
int ans = 0;
memset(have , false , sizeof(have));
memset(vis , false , sizeof(vis));
for(int i = 0 ; i <= n ; i++) {
if(a[i] != b[i] || i == 0) {
if(i) ans++;
have[a[i]] = true , have[b[i]] = true;
vc[a[i]].push_back(b[i]);
}
}
for(int i = 0 ; i <= n ; i++) {
if(!vis[i] && have[i]) {
dfs(i) , ans++;
}
}
ans--;//这里的ans--是减去第0位点被算进去的情况
ans = max(ans , 0);
cout << ans << endl;
return 0;
}
Atcoder D - XOR Replace(思维)的更多相关文章
- AGC016D - XOR Replace 置换/轮换
目录 题目链接 题解 代码 题目链接 AGC016D - XOR Replace 题解 可以发现一次操作相当于一次置换 对于每个a上的位置映射到b对应 可以找到置换群中的 所有轮换 一个k个元素的轮换 ...
- AGC 16 D - XOR Replace
AGC 16 D - XOR Replace 附上attack(自为风月马前卒爷) 的题解 Problem Statement There is a sequence of length N: a=( ...
- AtcoderGrandContest 016 D.XOR Replace
$ >AtcoderGrandContest \space 016 D.XOR\space Replace<$ 题目大意 : 有两个长度为 \(n\) 的数组 \(A, B\) ,每次操作 ...
- AtCoder - 3913 XOR Tree
Problem Statement You are given a tree with N vertices. The vertices are numbered 0 through N−1, and ...
- 【做题】agc016d - XOR Replace——序列置换&环
原文链接 https://www.cnblogs.com/cly-none/p/9813163.html 题意:给出初始序列\(a\)和目标序列\(b\),都有\(n\)个元素.每次操作可以把\(a\ ...
- agc016D - XOR Replace(图论 智商)
题意 题目链接 给出两个长度为\(n\)的数组\(a, b\) 每次可以将\(a\)中的某个数替换为所有数\(xor\)之和. 若\(a\)数组可以转换为\(b\)数组,输出最少操作次数 否则输出\( ...
- atcoder E - Jigsaw(思维)
题目链接:http://agc017.contest.atcoder.jp/tasks/agc017_e 题解:这题很巧妙运用了cnt[i]抽象的表示了上下互补的状态,最后上面突出的一定要处理完.下面 ...
- Atcoder C - +/- Rectangle(思维+构造)
题目链接:http://agc016.contest.atcoder.jp/tasks/agc016_c 题解:挺简单的构造,很容易想到的构造方法就是(h*w)的小矩阵里其他值赋值为1,最后一个赋值为 ...
- Atcoder F - Mirrored(思维+搜索)
题目链接:http://arc075.contest.atcoder.jp/tasks/arc075_d 题意:求rev(N)=N+D的个数,rev表示取反.例如rev(123)=321 题解:具体看 ...
随机推荐
- 电信光猫带路由器(F452)的虚拟服务器端口映射
现在电信宽带的光猫一般都自带路由器功能,为了方便运营商管理网络用户,电信公司插入了企业局域网,网络用户的光猫路由器都是这个局域网的节点.用户家里的电脑在网络中的结构位置一般如下所示: 互联网(公网)= ...
- 从js 讲解时间复杂度和空间复杂度
1. 博客背景 今天有同事在检查代码的时候,由于函数写的性能不是很好,被打回去重构了,细思极恐,今天和大家分享一篇用js讲解的时间复杂度和空间复杂度的博客 2. 复杂度的表示方式 之前有看过的,你可能 ...
- 激活函数、正向传播、反向传播及softmax分类器,一篇就够了!
1. 深度学习有哪些应用 图像:图像识别.物体识别.图片美化.图片修复.目标检测. 自然语言处理:机器创作.个性化推荐.文本分类.翻译.自动纠错.情感分析. 数值预测.量化交易 2. 什么是神经网络 ...
- java基本数据类型和包装类之间的区别
1.声明方式不同,基本类型不适用new关键字,而包装类型需要使用new关键字来在堆中分配存储空间: 2.存储方式及位置不同,基本类型是直接将变量值存储在堆栈中,而包装类型是将对象放在堆中,然后通过引用 ...
- dotnetcore 与 hbase 之二——thrift 客户端的制作
说明 在上一篇文章dotnetcore 与 hbase 之一--hbase 环境准备结束后,我们已经有了 hbase 数据库环境.接下来就可以利用 thrift 生成 c# hbase 客户端了.如果 ...
- Python中input()的使用方法
input()以字符串的方式获取用户输入: >>> x = input() 4.5 >>> type(x) <class 'str'> >> ...
- 百度Echarts,蚂蚁金服G2,D3三种主流可视化工具对比
1.百度的Echarts 官网:https://echarts.baidu.com/ 介绍:ECharts,缩写来自Enterprise Charts,是百度推出的一款开源的,商业级数据图表,它最初是 ...
- CodeForces 939F Cutlet
洛谷题目页面传送门 & CodeForces题目页面传送门 题意见洛谷里的翻译. 这是一道毒瘤的div. 2 F,我是不可能比赛的时候做出来的... (以下设两面都要煎\(n\)分钟,有\(m ...
- ZooKeeper系列(三)—— Zookeeper 常用 Shell 命令
一.节点增删改查 1.1 启动服务和连接服务 # 启动服务 bin/zkServer.sh start #连接服务 不指定服务地址则默认连接到localhost:2181 zkCli.sh -serv ...
- thinkphp 框架两种模式 两种模式:开发调试模式、线上生产模式
define(‘APP_DEBUG’,true/false);