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;
    }
  • 相关阅读:
    url编码
    客户端安全-xss-1类型介绍
    阿里云扩容教程
    jquery获取和设置表单数据
    uMlet建模工具
    phpstorm的调试工具xdebug
    服务器如何处理http请求
    http基础实战
    协程
    Goroutine(协程)为何能处理大并发?
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754935.html
Copyright © 2011-2022 走看看