首页 > 其他分享 >[AGC016D] XOR Replace 题解

[AGC016D] XOR Replace 题解

时间:2023-12-17 23:11:58浏览次数:31  
标签:连通 ch XOR int 题解 路径 Replace read mp

题目链接

点击打开链接

题目解法

很有思维难度的一道题

首先考虑简化操作(或者说用一种比较好的方法表示)
假设我们选择交换的位置为 \(x\),不难发现,操作等价于交换 \(sumxor\) 和 \(x\)
于是,有解的条件就好判了,即 \(\{b_i\}\subseteq \{a_i\}\bigcap \{x\}\)

操作可以理解为路径,即我们将 \(b_i\to a_i\) 连边(\(a_i\neq b_i\)),需要将每条边的遍历恰好一次(因为这样操作次数最小),
对于连通内的理解是找到一条欧拉路径,根据有解的性质,这个连通块出度和入度的差 \(\le 1\),所以一定有欧拉路径
对于多个连通块,考虑用一条路径将两个连通块串起来
因为对于所有连通块,至多只有一个的出度 $\neq $ 入度,且差 \(\le 1\),即说明至多只有一个存在欧拉路径,其他连通块都是存在欧拉回路,这样不难构造出一条合法的路径,使得经过的路径数目为 边数 + 连通块数 - 1

注意特判异或和为孤立点的情况
时间复杂度 \(O(n\log n)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=200100;
int n,a[N],b[N];
map<int,int> mp;
bool used[N];
int fa[N],siz[N];
int get_father(int x){ return x==fa[x]?x:fa[x]=get_father(fa[x]);}
int main(){
    n=read();
    int sxor=0;
    F(i,1,n) a[i]=read(),mp[a[i]]++,sxor^=a[i];
    F(i,1,n) b[i]=read(),mp[b[i]]--;
    mp[sxor]++;
    for(auto it:mp) if(it.second<0){ puts("-1");exit(0);}
    int cnt=0;
    for(auto &it:mp) it.second=++cnt;
    F(i,1,n) a[i]=mp[a[i]],b[i]=mp[b[i]];sxor=mp[sxor];
    F(i,1,cnt) fa[i]=i;
    int ans=0;
    F(i,1,n) if(a[i]!=b[i]) fa[get_father(b[i])]=get_father(a[i]),ans++,used[a[i]]=used[b[i]]=true;
    F(i,1,cnt) if(used[i]) siz[get_father(i)]++;
    F(i,1,cnt) ans+=siz[i]>0;
    if(!used[sxor]) ans++;
    printf("%d\n",max(0,ans-1));
    fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
    return 0;
}

标签:连通,ch,XOR,int,题解,路径,Replace,read,mp
From: https://www.cnblogs.com/Farmer-djx/p/17910071.html

相关文章

  • 题解 ABC333F【Bomb Game 2】
    来个可能有点麻烦但不用动脑子的暴力做法。直接设\(f_{i,j}\)表示有\(i\)个人时,第\(j\)个人幸存的概率。显然有\(f_{1,1}=1\)。对于\(i>1\),分类讨论容易得到:\[f_{i,j}=\begin{cases}\frac{f_{i,n}}{2},&j=1\\\frac{f_{i-1,j-1}+f_{i,j-1}}{2},&1<j\lei\\\e......
  • 链表面试题解析
    链表面试题解析1.删除链表中=val的所有节点/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){......
  • BZOJ4403 序列统计 题解
    题目传送门前置知识排列组合|卢卡斯定理解法记\(m=r-l+1,0\lek\len-1\),枚举长度\(i\),等价于求\(\sum\limits_{j=1}^{m}x_j=i\)的非负整数解的数量。接着推式子就行。\(\begin{aligned}\sum\limits_{i=1}^{n}\dbinom{m+i-1}{i}\end{aligned}\)\(\begin{aligned......
  • 【电子公文系统】常见问题解答
    Q:如何在电子公文系统中创建新文档?A:登录系统后,点击“新建文档”按钮,选择相应的文档模板开始编辑。编辑完成后,可以选择保存草稿或提交审批。Q:我忘记了我的登录密码,应该怎么办?A:在登录界面点击“忘记密码”链接,根据提示输入你的电子邮箱或电话号码以接收重置密码的......
  • 2023ISCTF的fry题解及进阶格式化利用
    这题是一个比较好的进阶格式化利用。就是有点繁琐。先惯例checksec一下心脏骤停hhh。没事先分析一下Main函数int__cdeclmain(intargc,constchar**argv,constchar**envp){init(argc,argv,envp);puts("WelcometoISCTF~~~~~~~~~~~~~~~~");puts("Doyouwantto......
  • [Ynoi2004] rpmtdq 题解
    人生第一发\(Ynoi\)的题,写一篇题解庆祝一下传送门我们可以发现,对于二元组\((x,y)\),若存在一个\(dist(i,j)\ledist(x,y),x<i<j<y\)那么答案肯定不是二元组\((x,y)\)我们可以考虑把这些肯定不是的点剔除掉考虑怎么找,我们可以先点分治,求出每个点......
  • AT_abc333_e [ABC333E] Takahashi Quest 题解
    AT_abc333_e[ABC333E]TakahashiQuest题解思路解析可以发现一瓶药水无论什么时候拿被使用掉的时间都是不会变的,所以如果我们想让一瓶药水再背包里待得时间尽可能的短就要让它尽可能的被晚拿起来,于是我们就可以想到使用栈存下每一瓶同类的药水分别出现的时间,此时每遇到一只怪......
  • 无涯教程-Java - String replaceFirst(String regex, String replacement)函数
    使用replacement替换第一个匹配的字符串。StringreplaceFirst-语法publicStringreplaceFirst(Stringregex,Stringreplacement)这是参数的详细信息-regex       -此字符串要匹配的正则表达式。replacement -将替换找到的表达式的字符串。String......
  • 2022年RHCE认证考题解析最新版—RH294环境【转】
    由于本人10.17已成功考过CSA,经过两周所学的ansible并结合题库整理出来的CE解析版我也是11月月底就要考了,不过这套解析也是可以满足今年的redhat8题库文中可能涉及一些命令的参数解释,如有不懂的伙伴可参考我的笔记Ansibleps:一切模板似的题库考试,都需要经过大脑的理解方可顺利上......
  • VMware workstation中安装的centos虚拟机ip自动获取可以上网,设置静态ip不能上网问题解
    一、需求   linux中我们会设置hosts文件,这会涉及ip和域名的设置,但是如果虚拟机自动获取ip地址的话,这就意味着之前设置的hosts文件需要重新修改,所以我们需要设置虚拟机为静态ip地址。二、故障现象   我linux虚拟机最开始是自动获取的ip地址,用的nat模式,是可以上网的,......