传送门

题目大意

给定两个长为$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$的异或和时不需要走这一步。

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<set>
  7. #define LL long long
  8. #define M 200020
  9. using namespace std;
  10. namespace IO{
  11. const int BS=(1<<20); int Top=0;
  12. char Buffer[BS],OT[BS],*OS=OT,*HD,*TL,SS[20]; const char *fin=OT+BS-1;
  13. char Getchar(){if(HD==TL){TL=(HD=Buffer)+fread(Buffer,1,BS-1,stdin);} return (HD==TL)?EOF:*HD++;}
  14. void write(int x){
  15. if(!x){putchar('0');return;} if(x<0) x=-x,putchar('-');
  16. while(x) SS[++Top]=x%10,x/=10;
  17. while(Top) putchar(SS[Top]+'0'),--Top;
  18. }
  19. int read(){
  20. int nm=0,fh=1; char cw=Getchar();
  21. for(;!isdigit(cw);cw=Getchar()) if(cw=='-') fh=-fh;
  22. for(;isdigit(cw);cw=Getchar()) nm=nm*10+(cw-'0');
  23. return nm*fh;
  24. }
  25. }
  26. using namespace IO;
  27. int ans,n,m,A[M],B[M],C[M],D[M],f[M],sz[M];
  28. int fd(int x){return x==f[x]?x:f[x]=fd(f[x]);}
  29. int main(){
  30. n=read();
  31. for(int i=1;i<=n;i++) C[i]=A[i]=read(),A[n+1]^=A[i];
  32. for(int i=1;i<=n;i++) D[i]=B[i]=read(),B[n+1]^=B[i];
  33. n++,C[n]=A[n],D[n]=B[n],sort(C+1,C+n+1),sort(D+1,D+n+1);
  34. for(int i=1;i<=n;i++) if(C[i]!=D[i]){write(-1),putchar('\n');return 0;}
  35. m=unique(C+1,C+n+1)-(C+1); for(int i=0;i<=m+2;i++) f[i]=i,sz[i]=1;
  36. for(int i=1;i<=n;i++){
  37. ans+=(A[i]!=B[i]&&i<n);
  38. A[i]=lower_bound(C+1,C+m+1,A[i])-C;
  39. B[i]=lower_bound(C+1,C+m+1,B[i])-C;
  40. int x=fd(A[i]),y=fd(B[i]); if(x!=y) f[x]=y,sz[y]+=sz[x];
  41. }
  42. for(int i=1;i<=n;i++) ans+=(fd(i)==i&&sz[fd(i)]>1);
  43. if(A[n]!=B[n]||sz[fd(A[n])]>1) ans--;
  44. write(ans),putchar('\n'); return 0;
  45. }

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. iOS --创建文件夹 ,删除文件夹

    //创建文件夹 --> 返回 文件夹 - (NSString *)pathToPatientPhotoFolder { NSString *documentsDirectory = [NSSea ...

  2. iOS 平台如何使用 TestFlight 进行 Beta 测试

    使用 TestFlight,你可以向测试人员发布你 App 的 prerelease 版本来收集反馈信息,为将来发布 App 的正式版做准备.现在 TestFlight 是一个可选功能,你也可以不使用 ...

  3. Xcode8:"subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0" 的警告

    运行xcode8遇到这个警告: subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_lev ...

  4. USB设备驱动程序(一)

    USB驱动编程原理: 当我们把USB设备插入USB口时会提示需要安装相对应的驱动,如USB鼠标.USB键盘等,这些电脑自己自身已经自带有相对于的驱动程序, 当电脑检查到该USB设备类型相同就去帮你安装 ...

  5. Computer Transformation(简单数学题+大数)

    H - Computer Transformation Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &am ...

  6. 【译】常见 Java 异常解释(恶搞版)

    常见 Java 异常解释:(译者注:非技术角度分析.阅读有风险,理解需谨慎o(╯□╰)o) java.lang ArithmeticException 你正在试图使用电脑解决一个自己解决不了的数学问题 ...

  7. Java 迭代器

    1.快速报错 public class FailFast { public static void main(String[] args) { List<String> c = new A ...

  8. Activiti使用过程_1

    1 微信公众号:

  9. activiti--4----------------------------------流程变量

    一.流程变量的作用 1.用来传递业务参数 2.指定连线完成任务(同意或拒绝) 3.动态指定任务办理人 二.测试代码块 Person类 package com.xingshang.processVari ...

  10. MYSQL:基础——事务处理

    MYSQL:基础——事务处理 事物处理 1.什么是事物处理 事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行 ...