传送门

题目大意

给定两个长为$n$的序列$A,B$你可以进行若干组操作,每次操作选定一各位置$x$,令$A_x$等于$A$的异或和。

问能否通过一定操作使得$A$成为$B$,如果能,求最小操作书数。

题解

考虑操作的意义,找找规律就知道第一次操作是把一个数变为异或和,以后每次操作都是把这个数变成上次操作位置原来的数,因此由以下几个结论。

一定有解,当且仅当排序后$A,B$完全相同或至多一个数不相同且$B$中的那个数是$A$所有元素的异或和。

所以判无解有一个技巧,令$A_{n+1}=A$的异或和,$B$同理,仔细想一想不难发现条件成立当且仅当新的$A,B$在排序后完全相同。

此处应$Orz\space Hwc\space Otz$。

接下考虑把每一个出现的数看做一个点,对于所有$A_i\ne B_i$,我们知道操作它之前一定会先操作一个$j$使得$A_j=B_i$,所以我们就连一条$(B_i\rightarrow A_i)$的边,最终除了第一步,每次操作可以视为沿着当前的点走一条边,目的是走完所有边至少一次。不难想到所有的弱连通块都是由若干个环所构成的强联通块,所以出去第一次操作所走完的代价是边数,而第一次操作需进入一个连通块,当且仅当连通块中有$A$的异或和时不需要走这一步。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<set>
#define LL long long
#define M 200020
using namespace std;
namespace IO{
const int BS=(1<<20); int Top=0;
char Buffer[BS],OT[BS],*OS=OT,*HD,*TL,SS[20]; const char *fin=OT+BS-1;
char Getchar(){if(HD==TL){TL=(HD=Buffer)+fread(Buffer,1,BS-1,stdin);} return (HD==TL)?EOF:*HD++;}
void write(int x){
if(!x){putchar('0');return;} if(x<0) x=-x,putchar('-');
while(x) SS[++Top]=x%10,x/=10;
while(Top) putchar(SS[Top]+'0'),--Top;
}
int read(){
int nm=0,fh=1; char cw=Getchar();
for(;!isdigit(cw);cw=Getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=Getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
}
using namespace IO;
int ans,n,m,A[M],B[M],C[M],D[M],f[M],sz[M];
int fd(int x){return x==f[x]?x:f[x]=fd(f[x]);}
int main(){
n=read();
for(int i=1;i<=n;i++) C[i]=A[i]=read(),A[n+1]^=A[i];
for(int i=1;i<=n;i++) D[i]=B[i]=read(),B[n+1]^=B[i];
n++,C[n]=A[n],D[n]=B[n],sort(C+1,C+n+1),sort(D+1,D+n+1);
for(int i=1;i<=n;i++) if(C[i]!=D[i]){write(-1),putchar('\n');return 0;}
m=unique(C+1,C+n+1)-(C+1); for(int i=0;i<=m+2;i++) f[i]=i,sz[i]=1;
for(int i=1;i<=n;i++){
ans+=(A[i]!=B[i]&&i<n);
A[i]=lower_bound(C+1,C+m+1,A[i])-C;
B[i]=lower_bound(C+1,C+m+1,B[i])-C;
int x=fd(A[i]),y=fd(B[i]); if(x!=y) f[x]=y,sz[y]+=sz[x];
}
for(int i=1;i<=n;i++) ans+=(fd(i)==i&&sz[fd(i)]>1);
if(A[n]!=B[n]||sz[fd(A[n])]>1) ans--;
write(ans),putchar('\n'); return 0;
}

Agc016_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. AtcoderGrandContest 016 D.XOR Replace

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

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

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

  5. Atcoder D - XOR Replace(思维)

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

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

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

  7. 【agc016D】XOR Replace

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

  8. [agc016d]xor replace

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

  9. 【AtCoder】AGC016

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

随机推荐

  1. 安装Hadoop 1.1.2 (二 安装配置SSH)

    1 查找SSH  yum search ssh 2 如果没有安装, yum install openssh.x86_64 4 直接运行  ssh-keygen -t dsa -P '' -f /roo ...

  2. EhCache 集群 配置(RMI方式)

    这里先说明下环境:JDK1.6.ehcache-core-2.1.0.jar.Tomcat6.Spring3.0.2.使用的是RMI方式配置集群的,这里先吐槽下遇到的情况,在搜相关知识的时候发现到处都 ...

  3. 【BZOJ4537】[Hnoi2016]最小公倍数 分块

    [BZOJ4537][Hnoi2016]最小公倍数 Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n),每条边上带有权值.所有权值都可以分解成2^a*3^b的形式.现在 ...

  4. 第三课 nodejs读取文件

    //引入文件操作模块var fs = require('fs'); //读取文件 使用 回调函数 utf-8编码读取 a.txt在当前文件目录fs.readFile('a.txt','UTF-8',f ...

  5. zabbix_get 命令介绍

    zabbix_get 是 zabbix 服务端的一个命令,用于检测 agent 端的配置是否正确,可以很方便地知道 key 是否能正常获取到数据,在测试自定义监控的时候特别有用 [root@crazy ...

  6. 销售订单、外向交货单、交货 bapi

    转自[http://www.cnblogs.com/elegantok/archive/2009/10/18/1585398.html]***********SALES ORDER INPUT CRE ...

  7. web audio living

    总结网页音频直播的方案和遇到的问题. 代码:(github,待整理) 结果: 使用opus音频编码,web audio api 播放,可以达到100ms以内延时,高质量,低流量的音频直播. 背景: V ...

  8. Data Structure Binary Search Tree: Find k-th smallest element in BST (Order Statistics in BST)

    http://www.geeksforgeeks.org/find-k-th-smallest-element-in-bst-order-statistics-in-bst/ #include < ...

  9. ios中文模糊搜索兼容问题

    $(function(){ var cpLock = true; $("input[name='name']").off().on({ compositionstart: func ...

  10. 【六】MongoDB管理之副本集

    一.复制介绍 所谓的复制就是在多个主机之间同步数据的过程. 1.数据冗余及可用性 复制技术提供数据冗余及可用性,在不同的数据库服务器上使用多个数据副本,复制技术防止单个数据库服务器出现数据故障而出现数 ...