火柴排队

Posted 66dzb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了火柴排队相关的知识,希望对你有一定的参考价值。

【TIMEGate】

https://www.luogu.org/problem/P1966

【解题思路】

归并排序

【code】

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <iostream>
 4 using namespace std;
 5 const int mod=99999997;
 6 int i,n,ans,mid;
 7 int c[100005],d[100005];
 8 struct node{
 9        int h;
10        int id;
11 }a[100005],b[100005];
12 bool cmp(node a,node b){
13      return a.h<b.h;
14 }
15 void mergesort(int left,int right){
16     if(right<=left)return;
17     int mid=(left+right)/2;
18     int i=left,j=mid+1,cnt=0;
19     mergesort(left,mid);
20     mergesort(mid+1,right);
21     while(i<=mid&&j<=right){
22         if(c[i]<=c[j])d[++cnt]=c[i++];
23         else {
24             d[++cnt]=c[j++];
25             ans+=mid-i+1;
26             ans%=mod;
27         }
28     }
29     if(i>mid)
30         while(j<=right)
31             d[++cnt]=c[j++];
32     else 
33         while(i<=mid)
34             d[++cnt]=c[i++];
35     for(i=left,j=1;j<=cnt;i++,j++)c[i]=d[j];
36 }
37 int main(){
38     //freopen("match.in","r",stdin);
39     //freopen("match.out","w",stdout);
40     scanf("%d",&n);
41     for (i=1;i<=n;i++){
42         scanf("%d",&a[i].h);
43         a[i].id=i;
44     }
45     for (i=1;i<=n;i++){
46         scanf("%d",&b[i].h);
47         b[i].id=i;
48     }
49     sort(a+1,a+n+1,cmp);
50     sort(b+1,b+n+1,cmp);
51     for (i=1;i<=n;i++)
52         c[b[i].id]=a[i].id;
53     mergesort(1,n);           
54     printf("%d
",ans);
55     return 0;
56 }

 

以上是关于火柴排队的主要内容,如果未能解决你的问题,请参考以下文章

codevs 3286 火柴排队

火柴排队

1966 火柴排队

rqnoj(PID737 / 火柴排队 match)

COdevs 3286 火柴排队

luogu1966 火柴排队