Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34311 | A21μΘ_wjy | 【S】T2 | C++ | 通过 | 100 | 94 MS | 5400 KB | 1234 | 2024-11-05 19:51:57 |
#include<bits/stdc++.h> #define int long long using namespace std; const int maxn=2e5+7; int n; int a[maxn],b[maxn]; int XA,XB; int tmp[maxn<<1],cnt; int f[maxn]; inline void Init(int n){for(int i=1;i<=n;i++)f[i]=i;} inline int Find(int x){return x==f[x]?x:f[x]=Find(f[x]);} inline void Mrg(int x,int y){f[Find(x)]=Find(y);} signed main(){ // freopen("xor.in","r",stdin); // freopen("xor.out","w",stdout); cin>>n; for(int i=1;i<=n;i++)cin>>a[i],XA^=a[i];a[n+1]=XA; for(int i=1;i<=n;i++)cin>>b[i],XB^=b[i];b[n+1]=XB; n++; int ans=0; for(int i=1;i<=n;i++){ if(a[i]!=b[i]||(i==n)){//不考虑自环 tmp[++cnt]=a[i];tmp[++cnt]=b[i]; if(i<n)ans++;//对于普通联通块的贡献是边数+1,包含的话就不加1 } } sort(tmp+1,tmp+cnt+1); int tot=unique(tmp+1,tmp+cnt+1)-tmp-1; Init(tot); for(int i=1;i<=n;i++){ if(a[i]==b[i])continue; a[i]=lower_bound(tmp+1,tmp+tot+1,a[i])-tmp; b[i]=lower_bound(tmp+1,tmp+tot+1,b[i])-tmp; Mrg(a[i],b[i]); } for(int i=1;i<=tot;i++){ if(Find(i)==i)ans++; } cout<<ans-1<<endl;//n+1是否为孤立点 return 0; }