[agc016d]xor replace
题意:
题解:
棒棒的神仙题。。。这题只是D题???(myh:看题五分钟,讨论两小时)
首先这个异或和是假的,比如我现在有$a=(a_1,a_2,a_3,a_4)$,操作一下$a_2$,就变成了$a=(a_1,a_1\oplus a_2\oplus a_3\oplus a_4,a_3,a_4)$;
再操作一下$a_3$,因为$a_i\oplus a_i=0$,它就变回了$a=(a_1,a_1\oplus a_2\oplus a_3\oplus a_4,a_2,a_4)$。
所以这个操作只是第一次把一个位置变成全体的异或和,后面就是在交换两个数的位置。。。
可以考虑把多出来的这个全体异或和放到$N+1$的位置,然后就变成了一次操作是交换$1$到$N$中的一个位置的数和第$N+1$个位置的数,求要多少次操作把数组a变成数组b。
无解的情况显然:如果两个数组排序后有位置不同则必定无解,先判掉;
把数组离散化,然后对于位置$i$,若$a_i\neq b_i$则从$a_i$到$b_i$连一条边;
这样子对于每个联通块,设其大小为$S$,则必定可以用$S-1$次操作使其中的位置全部满足条件(感性理解一下?);
在每个联通块之间,需要额外的一次操作使$N+1$的位置在两个块之间转换;
最后要特殊考虑$N+1$这个位置,如果它已经在某个联通块内则没有影响,否则要单独作为一个联通块考虑,答案++;
所以最后的答案就是边数+联通块数-1,用并查集xjb维护一下即可。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
int n,ans=,ta=,tb=,cnt=,fa[],a[],b[],aa[],bb[],lsh[];
map<int,bool>mp;
int ff(int u){
return fa[u]==u?u:fa[u]=ff(fa[u]);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
ta^=a[i];
aa[i]=a[i];
}
for(int i=;i<=n;i++){
scanf("%d",&b[i]);
tb^=b[i];
bb[i]=b[i];
}
n++;
a[n]=aa[n]=ta,b[n]=bb[n]=tb;
sort(aa+,aa+n+);
sort(bb+,bb+n+);
for(int i=;i<n;i++){
if(aa[i]!=bb[i])return puts("-1"),;
}
for(int i=;i<n;i++){
if(a[i]!=b[i]){
lsh[++cnt]=a[i];
lsh[++cnt]=b[i];
ans++;
}
}
lsh[++cnt]=ta;
lsh[++cnt]=tb;
if(!ans)return puts(""),;
sort(lsh+,lsh+cnt+);
cnt=unique(lsh+,lsh+cnt+)-lsh-;
for(int i=;i<=cnt;i++)fa[i]=i;
for(int i=;i<=n;i++){
if(a[i]!=b[i]){
a[i]=lower_bound(lsh+,lsh+cnt+,a[i])-lsh;
b[i]=lower_bound(lsh+,lsh+cnt+,b[i])-lsh;
if(!mp[a[i]])mp[a[i]]=true;
if(!mp[b[i]])mp[b[i]]=true;
int f1=ff(a[i]),f2=ff(b[i]);
fa[f1]=f2;
}
}
for(int i=;i<=cnt;i++){
if(fa[i]==i)ans++;
}
printf("%d",ans-);
return ;
}
[agc016d]xor replace的更多相关文章
- AGC016D - XOR Replace 置换/轮换
目录 题目链接 题解 代码 题目链接 AGC016D - XOR Replace 题解 可以发现一次操作相当于一次置换 对于每个a上的位置映射到b对应 可以找到置换群中的 所有轮换 一个k个元素的轮换 ...
- agc016D - XOR Replace(图论 智商)
题意 题目链接 给出两个长度为\(n\)的数组\(a, b\) 每次可以将\(a\)中的某个数替换为所有数\(xor\)之和. 若\(a\)数组可以转换为\(b\)数组,输出最少操作次数 否则输出\( ...
- 【做题】agc016d - XOR Replace——序列置换&环
原文链接 https://www.cnblogs.com/cly-none/p/9813163.html 题意:给出初始序列\(a\)和目标序列\(b\),都有\(n\)个元素.每次操作可以把\(a\ ...
- AGC 16 D - XOR Replace
AGC 16 D - XOR Replace 附上attack(自为风月马前卒爷) 的题解 Problem Statement There is a sequence of length N: a=( ...
- 【agc016D】XOR Replace
Portal --> agc016D Description 一个序列,一次操作将某个位置变成整个序列的异或和,现在给定一个目标序列,问最少几步可以得到目标序列 Solution 翀 ...
- AtcoderGrandContest 016 D.XOR Replace
$ >AtcoderGrandContest \space 016 D.XOR\space Replace<$ 题目大意 : 有两个长度为 \(n\) 的数组 \(A, B\) ,每次操作 ...
- Agc016_D XOR Replace
传送门 题目大意 给定两个长为$n$的序列$A,B$你可以进行若干组操作,每次操作选定一各位置$x$,令$A_x$等于$A$的异或和. 问能否通过一定操作使得$A$成为$B$,如果能,求最小操作书数. ...
- Atcoder D - XOR Replace(思维)
题目链接:http://agc016.contest.atcoder.jp/tasks/agc016_d 题解:稍微想一下就知道除了第一次的x是所有的异或值,之后的x都是原先被替换掉的a[i]所以要想 ...
- 【AtCoder】AGC016
A - Shrinking 用每个字母模拟一下就行 #include <bits/stdc++.h> #define fi first #define se second #define ...
随机推荐
- java导出excel通用方法
首先需要引入的jar包: 正式代码了. import java.io.FileOutputStream; import java.io.OutputStream; import java.net.UR ...
- bzoj 3028: 食物 生成函数_麦克劳林展开
不管怎么求似乎都不太好求,我们试试生成函数.这个东西好神奇.生成函数的精华是两个生成函数相乘,对应 $x^{i}$ 前的系数表示取 $i$ 个时的方案数. 有时候,我们会将函数按等比数列求和公式进行压 ...
- css——定位
position absolute:绝对定位 1.以页面的左上角为原点 2.不保留原来的位置 3.z-index可以调整图层顺序 如果想实现以父级元素左上角为原点.则:父级相对,子级绝对 在子级绝对的 ...
- PAT 天梯赛练习集 L2-022. 重排链表
题目链接:https://www.patest.cn/contests/gplt/L2-022 给定一个单链表 L1→L2→...→Ln-1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln-1→L ...
- Linux之awk使用
基本语法 $n :当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段 $0:执行过程中当前行的文本内容 \t:制表符 \n:换行符 -F'[:#/]' : 定义三个分隔符,注意有-F ...
- vuex中mutations与actions的区别
要执行vuex中的函数,有两种方法: 1.commit,例如this.$store.commit("GETMODULESELECTLIST"); //mutations中的方法 2 ...
- java中 flush()方法的作用
flush() 是清空,而不是刷新啊.一般主要用在IO中,即清空缓冲区数据,就是说你用读写流的时候,其实数据是先被读到了内存中,然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还 ...
- Windows系统环境变量、JAVA环境变量配置以及JVM加载过程
一:用户变量和系统变量的区别 右击我的电脑.属性.高级系统设置.环境变量. 对话框的上面为Administrator的用户变量,对话框的下面为系统变量.我们所说的环境变量一般指系统环境变量,对所有用户 ...
- Image Processing for Very Large Images
The key idea here is the partial image descriptor VIPS(VASARI Image Processing System) 是近几年逐渐兴起的针对大图 ...
- oauth2.0里回调地址返回code中如何让code不显示在URL里?
背景: 最近在调用对方提供的oauth2.0接口的时候,返回code在URL显示,但是会影响到本系统调用其他的菜单项的操作,所以想把返回的code值去掉. 解决办法: 想了各种解决办法,目前把 ...
