Description

         LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人。他对人说话,总是满口垃圾题目者也,教人半懂不懂的。因为他姓李,别人便从QQ群上的“毒瘤李Fee”这半懂不懂的话里,替他取下一个绰号,叫做李Fee。
        李Fee一到机房,所有做题的人便都看着他笑,有的叫道,“李Fee,你又来出毒瘤题了!”他不回答,对验题人说,“我又出了两道题,给我验验。”便排出一排毒瘤题。大家又故意的高声嚷道,“你又暴露奸商本性拿毒瘤题骗钱剥削验题人了!”李Fee睁大眼睛说,“你怎么这样凭空污人清白……”“什么清白?我前天亲眼见你出了道毒瘤骗钱题,被PTY把std吊着打。” 李Fee便涨红了脸,额上的青筋条条绽出,争辩道,“出题人的题不能算骗……毒瘤!……出题人的题,能算毒瘤骗钱题么?”接连便是难懂的话,什么“多叉splay随机点分治”,什么“树链剖分套分治FFT”之类,引得众人都哄笑起来:机房内外充满了快活的空气。
虽然他的题十分毒瘤,但他的题还总是有买家。李Fee现在有N道毒瘤题,想将这些题出成一组题来骗大钱。然而显而易见的是,一组题的毒瘤程度不仅和每道题的毒瘤程度有关,也跟它们的排列顺序有关,李Fee需要将它们排列成最毒瘤但又最能骗钱的那个顺序。
       具体来说,这N道题每题都有一个毒瘤值,它们构成了一个序列。李Fee心目中有一个理想的毒瘤值序列,这个序列并不一定每一题的毒瘤值都是原本N道题中出现的,所以李Fee准备进行一些改动。这些改动体现在毒瘤值上就是将某道题的毒瘤值改为所有题的毒瘤值的二进制异或值。但是,改动题目是很麻烦的,他想算出最少需要多少次改动才能将原本的毒瘤值序列改成理想的毒瘤值序列,李Fee忙于出毒瘤题,他想请发明O(1/n)算法用暴力搜过所有毒瘤题的你帮他算出答案。但是他是个奸商,所以他并不打算给你报酬。

Input

第一行1个正整数N,如题目所示。
第二行N个非负整数,表示初始的题目毒瘤值序列
第三行N个非负整数,表示理想的题目毒瘤值序列

Output

单独一行,一个整数,表示最少需要多少次改动
如果怎么改动都无法改成理想的毒瘤值序列,说明这组题出的相当失败,请输出-1

Sample Input

  1. 3
  2. 0 1 2
  3. 3 1 0

Sample Output

  1. 2
  2.  
  3. 样例解释:
  4. 第一次,整个序列异或为3,把第一个数0换成3,序列变成3,1,2
  5. 第二次,整个序列异或为0,把第三个数2换成0,序列变成3,1,0

Data Constraint

对于10%的数据,1<=N<=5
对于30%的数据,1<=N<=10
另有20%的数据,毒瘤值为0或1
对于100%的数据,1<=N<=100000 毒瘤值<2^30

Hint

不要被事物的表面现象所迷惑
 
做法(摘自jzoj):考虑操作的本质 只要按位稍微分析一下,就可以发现,题目相当于一开始手里抓着整个序列 a 的异 或,一次操作可以将手上的数与序列中的某个数换过来 知道操作的本质就简单许多 如果能够完成,方便起见将 a 的异或和 b 的异或分别加到序列末,排序后两个序 列显然完全相同,这样就把-1 判掉了 只有 a[i]!=b[i]的位置我们是需要调整的 那么将 a,b 离散化,a[i]与 b[i]连边 考虑统计答案 将一个联通块内换完所需要的次数明显就是联通块大小。 而联通块之间跳需要 1 的代价 此时由于我们一开始手上抓着的是 a 的异或和 如果它刚好在某一个联通块里面就不用考虑了,否则就必须将它自己看做一个大小 为 0 的联通块 联通块可以用并查集维护
 
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #define N 100007
  6. using namespace std;
  7. int n,t1,t2,f[N],cnt,ans,sum[N];
  8. struct arr{
  9. int num,id;
  10. }a[N],b[N];
  11.  
  12. int cmp(arr x,arr y){
  13. return x.num<y.num;
  14. }
  15.  
  16. int Cmp(arr x,arr y){
  17. return x.id<y.id;
  18. }
  19.  
  20. int find(int x){
  21. if (f[x]==x) return x;
  22. return f[x]=find(f[x]);
  23. }
  24.  
  25. int main(){
  26. freopen("duliu.in","r",stdin);
  27. freopen("duliu.out","w",stdout);
  28. scanf("%d",&n);
  29. for (int i=;i<=n;i++) scanf("%d",&a[i].num),a[i].id=i,t1^=a[i].num;
  30. for (int i=;i<=n;i++) scanf("%d",&b[i].num),b[i].id=i,t2^=b[i].num;
  31. a[n+].num=t1,b[n+].num=t2;
  32. a[n+].id=n+,b[n+].id=n+;
  33. int tmp=-0x3f3f3f3f;
  34. sort(a+,a+n+,cmp);
  35. sort(b+,b+n+,cmp);
  36. for (int i=;i<=n+;i++){
  37. if (a[i].num!=b[i].num){
  38. printf("-1");
  39. return ;
  40. }
  41. cnt++;
  42. if (a[i].num==tmp) cnt--;
  43. tmp=a[i].num;
  44. a[i].num=cnt,b[i].num=cnt;
  45. }
  46. for (int i=;i<=cnt;i++) f[i]=i;
  47. sort(a+,a+n+,Cmp);
  48. sort(b+,b+n+,Cmp);
  49. for (int i=;i<=n;i++){
  50. int u=a[i].num,v=b[i].num;
  51. if (u==v) continue;
  52. int q=find(u),p=find(v);
  53. ans++;
  54. if (q!=p) f[q]=p;
  55. }
  56. for (int i=;i<=cnt;i++) sum[find(i)]++;
  57. for (int i=;i<=cnt;i++)
  58. if (sum[i]>) ans++;
  59. if (f[a[n+].num]==a[n+].num&&sum[a[n+].num]==) ans++;
  60. printf("%d",ans-);
  61. }

JZOJ| 5910. DuLiu的更多相关文章

  1. [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)

    题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...

  2. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  3. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  4. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  5. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

  6. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  7. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

  8. [jzoj]4216.【NOIP2015模拟9.12】平方和

    Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...

  9. [jzoj]2938.【NOIP2012模拟8.9】分割田地

    Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...

随机推荐

  1. C# 一些零零碎碎的方法,都是些帮助类,留存,也希望能帮助到各位

    ---------------------------------------------------------------------------------------------------- ...

  2. 将Spring源码转换为工程 + 导入Eclipse时缺失jar包

    将源码转换为工程: 比如查看Spring事务部分的源码. 打开cmd窗口,切换到Spring-tx文件夹下,执行命令 “gradle cleanidea eclipse” . 缺失jar包: 第一步: ...

  3. CSS的框模型(div)与边距(margin、padding)

    所谓框模型,例如div标签,你就可以直接把它理解成一个相框. 这个相框里面的相片有高度和宽度,框本身也有一定的宽度.相框和别的相框之间,还有一定的边距. div设置常见属性 border:边框 pad ...

  4. vue-devtools插件安装

    1.git clone https://github.com/vuejs/vue-devtools.git 2.此时表示vue-devtools包下载完成,进入到对应的目录下cd vue-devtoo ...

  5. c#语言自增自减运算符深入剖析

    C语言的++和--对于初学者来说一直都是难题,甚至很多老手也会产生疑惑; 最大的问题在于 ++可以放在变量后面,也可以放在前面; 如 i++; ++i; 自减运算符与++原理一样,只是变量变价为减而已 ...

  6. canvas制作雪花效果

    <!DOCTYPE html><html> <head>    <meta http-equiv="Content-type" conte ...

  7. oracle 递归查询(来源于网络)

    比如 a   b a   c   a   e b   b1 b   b2 c   c1 e   e1 e   e3 d   d1 指定parent=a,选出 a   b a   c   a   e b ...

  8. matlab练习程序(粒子群优化PSO)

    算法没有和图像处理直接相关,不过对于图像分类中的模式识别相关算法,也许会用到这个优化算法. 算法步骤: 1.首先确定粒子个数与迭代次数. 2.对每个粒子随机初始化位置与速度. 3.采用如下公式更新每个 ...

  9. SPFieldLookupValue class

    using System; using Microsoft.SharePoint; namespace ConsoleApp { class Program { static void Main(st ...

  10. 由Asp.Net客户端控件生成的服务器端控件

    由Asp.Net客户端控件生成的服务器端控件(也就是给客户端控件添加 runnat="server"),这样的控件既能在js中通过id命.类名获取到,也能在服务器端根据id获取到