zoukankan      html  css  js  c++  java
  • Gym

      传送门

      这题我写了好几天终于懂了,果然还是太菜了。

      由题目给的样例可以看出,这个相交线的对数就是数第一行里每个数右边(左右都数会重复)有多少个数,在第二行里在该数的左边出现了,然后这样就可以转化为用逆序对求解了,首先在读入第一行的序列时,记录下每个 数对应的位置,然后在读入第二行的序列时,存入a数组的是这个数在第一行的位置。第一行里每个数右边有几个数,在第二行里在该数的左边出现了,那么关于该数的逆序对就有几个。

    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 100000+10
    #define ll long long
    int a[maxn],mp[maxn],c[maxn];
    ll ans;
    void msort(int l,int r)
    {
        if(l==r)return;
        int mid=(l+r)>>1;
        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])
            c[k++]=a[i++];
        else{
            c[k++]=a[j++];
            ans+=(mid-i+1);
        }
        }
        while(i<=mid)c[k++]=a[i++];
        while(j<=r)c[k++]=a[j++];
        for(i=l;i<=r;i++)
        a[i]=c[i];
    }
    
    int main()
    {
        std::ios::sync_with_stdio(false);
        int t;
        cin>>t;
        while(t--)
        {
            int n;
            cin>>n;
            for(int i=1;i<=n;i++)
            {
                int tmp;
                cin>>tmp;
                mp[tmp]=i;
            }
            for(int i=1;i<=n;i++)
            {
                int tmp;
                cin>>tmp;
                a[i]=mp[tmp];
    
            }
            ans=0;
            msort(1,n);
            cout<<ans<<endl;
    
    
        }
        return 0;
    }
  • 相关阅读:
    数据库使用动态监听导致EM起不来的解决方法
    OCP-1Z0-053-V12.02-115题
    OCP-1Z0-053-V12.02-150题
    OCP-1Z0-053-V12.02-136题
    OCP-1Z0-053-V12.02-154题
    OCP-1Z0-053-V12.02-149题
    OCP-1Z0-053-V12.02-146题
    OCP-1Z0-053-V12.02-160题
    OCP-1Z0-053-V12.02-157题
    OCP-1Z0-053-V12.02-164题
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754935.html
Copyright © 2011-2022 走看看