noip2013 火柴排序

涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:

::点击图片在新窗口中打开::

,其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的高度。
每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。

intput:

4
2 3 1 4
3 2 1 4

output:

1

思路:

先开一个结构体,然后输入。按照v的大小升序排序。

1 const int maxn=100010;
2 struct cyc
3 {
4     int V,id;
5 }a[maxn],b[maxn];

然后,将a中元素对应b的的位置储存到c。

最后,归并排序即可。

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #include<iomanip>
 8 #include<queue>
 9 using namespace std;
10 const int maxn=100010,lln=99999997;
11 struct cyc
12 {
13     int v,id;
14 }a[maxn],b[maxn];
15 int n;
16 int c[maxn],d[maxn];
17 int ans=0;
18 bool myc(cyc x,cyc y)
19 {
20     return x.v<y.v;
21 }
22 void work(int l,int r)
23 {
24     int mid,tmp,i,j;
25     if(l+1<r)
26     {
27         mid=(l+r)/2;
28         work(l,mid-1);
29         work(mid,r);
30         tmp=l;
31         for(i=l,j=mid;i<=mid-1&&j<=r;)
32         {
33             if(c[i]>c[j])
34             {
35                 d[tmp++]=c[j++];
36                 ans=1LL*(ans+mid-i)%lln;
37             }
38             else
39             {
40                 d[tmp++]=c[i++];
41             }
42         }
43         if(j<=r)
44         {
45             for(;j<=r;j++)    d[tmp++]=c[j];
46         }
47         else
48         {
49             for(;i<=mid-1;i++)    d[tmp++]=c[i];
50         }
51         for(i=l;i<=r;i++)
52             c[i]=d[i];
53     }
54     else{
55         if(l+1==r)
56         {
57             if(c[l]>c[r])
58             {
59                 swap(c[l],c[r]);
60                 ans=1LL*(ans+1)%lln;
61             }
62         }
63     }
64 }
65 int main()
66 {
67     /*freopen("2.in","r",stdin);
68     freopen("2.out","w",stdout);*/
69     //ios::sync_with_stdio(false);
70     cin>>n;
71     for(int i=1;i<=n;i++)
72     {
73         cin>>a[i].v;
74         a[i].id=i;
75     }
76     for(int i=1;i<=n;i++)
77     {
78         cin>>b[i].v;
79         b[i].id=i;
80     }
81     sort(a+1,a+1+n,myc);
82     sort(b+1,b+1+n,myc);
83     for(int i=1;i<=n;i++)
84         c[b[i].id]=a[i].id;
85     work(1,n);
86     cout<<ans<<endl;
87     return 0;
88 }
View Code
原文地址:https://www.cnblogs.com/zyker/p/5910180.html