题目链接: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;
}
												

最新文章

  1. Salesforce Apex 使用JSON数据的示例程序
  2. 上传图片插件鼠标手cursor:pointer;不生效
  3. 用css画出三角形【转】
  4. CSS创建三角形(小三角)的几种方法
  5. Spring Tool Suite中的Tomcat启动状态修改java代码保存立刻生效
  6. BootStrap弹窗
  7. thinkPHP模板的输出和模型的使用
  8. \\ip 映射 指定的网络名不再可用
  9. java基础 二分查找算法
  10. Sublime Text 3 安装使用
  11. HDU2009
  12. 微信公众号开发之access_token的全局共用
  13. EDK II之SMM/SMI
  14. CNN大战验证码
  15. windows 10 超级优化,同时解决本地磁盘100%的问题
  16. SGTtrick
  17. Retrofit 代理模式
  18. 利用webpack搭建的前端工程化环境
  19. vue学习生命周期(created和mounted区别)
  20. WinPcap权威指南(一)

热门文章

  1. 【iOS】Your account already has a valid ios
  2. PythonDay05
  3. js 共有和私有
  4. iOS的录屏功能
  5. Go中的指针
  6. .Net Core2.1 秒杀项目一步步实现CI/CD(Centos7.2)系列一:k8s高可用集群搭建总结以及部署API到k8s
  7. opencv 视觉项目学习笔记(二): 基于 svm 和 knn 车牌识别
  8. 在使用Lists.transform时,不会直接生成PurchaseOrderVo的集合对象,而是生成一个Function的集合
  9. 如何利用jenkins插件查看allure报告-----完整篇(解决404和无数据问题)
  10. Linux安装配置Samba共享文件系统