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;
    }
  • 相关阅读:
    .net ORM架构列表
    C#向win32程序窗口中的文本框设置指定文本
    C#串口通信总结
    MPF配置文件参数管理
    WF牛人们的资源
    BDD初步
    DevExpress 汉化(简单、实用、快速)
    WPF中的命令简述(Command)
    Devexpress汉化资源
    Silverlight架构列表
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754934.html
Copyright © 2011-2022 走看看