题意: 解法: 显然题目要求将置换变为只有一个环, 假设置换存在cnt个环,如果cnt!=1,那么需要操作cnt次. 对于翻面,只需要令sum{b[]}是奇数即可, 如果不是奇数则需要操作一次. code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=1e6+5; int mark[maxm]; int a[maxm]; int b[maxm]; int n; void solve(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++)cin>>b[i]; int cir=0; for(int i=1;i<=n;i++){ if(!mark[i]){ cir++; int x=i; while(!mark[x]){ mark[x]=1;x=a[x]; } } } int s=0; for(int i=1;i<=n;i++)s+=b[i]; int ans=0; if(s%2==0)ans++; if(cir!=1)ans+=cir; cout<<ans<<endl; } signed main(){ ios::sync_with_stdio(0);cin.tie(0); solve(); return 0; }