-
C - Intersections
- Gym - 101853C
- 题意:1-n的两个排列分别在两行上,相同的数连线求线的交点数
- 思路:哈希思想桶标记每个数在第一行的位置输入第二行时把每个位置上的数改为在第一行的位置
-
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 1008611 ll ans,n,x,t; int a[maxn],rp[maxn]; void msort(int l,int r) { if(l>=r) return ; int mid=(l+r)/2; msort(l,mid); msort(mid+1,r); int i=l,j=mid+1,k=l; while(i<=mid&&j<=r) { if(a[i]<=a[j]) rp[k++]=a[i++]; else { rp[k++]=a[j++]; ans+=mid-i+1; } } while(i<=mid) rp[k++]=a[i++]; while(j<=r) rp[k++]=a[j++]; for(int i=l; i<=r; i++) a[i]=rp[i]; } int main() { ios::sync_with_stdio(false); cin>>t; while(t--) { ans=0; cin>>n; for(int i=1; i<=n; i++) { cin>>x; rp[x]=i; } for(int i=1; i<=n; i++) { cin>>x; a[i]=rp[x]; } msort(1,n); cout<<ans<<endl; } return 0; }
C - Intersections -逆序数-归并排序
最新推荐文章于 2021-07-26 11:16:18 发布