Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
34311 A21μΘ_wjy 【S】T2 C++ 通过 100 94 MS 5400 KB 1234 2024-11-05 19:51:57

Tests(10/10):


#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; }


测评信息: