acwing_505 luogu_P1966火柴人排序个人刷题记录

文章描述了一个使用C++编写的程序,通过自定义比较函数对两个数组a和b进行排序,使得b数组中的元素按照a数组中元素的原始位置顺序排列,然后利用归并排序算法处理c数组,存储b数组元素在a数组对应位置的值。
摘要由CSDN通过智能技术生成

### 题解:

我们对于这个两个数组a,b;想办法把b排序成a样子,即a中最大对应几号位置,则b中最大也要对应到几号位置

 #include<bits/stdc++.h>
 #define LL long long
 using namespace std;
 ​
 const int N = 1e5 + 10;
 int n;
 class num{
     public:
         LL x;
         int cnt;    
 }a[N],b[N];
 int c[N],p[N];
 bool cmp(num &p,num &q)
 {
     return p.x < q.x;
 }
 ​
 int merge_sort(int l,int r)
 {
     if(l >= r)return 0;
     int m = l + r >> 1;
     int ans = ((merge_sort(l,m) + merge_sort(m + 1,r)) % 99999997);
     int i = l,j = m + 1,k = 1;
     while(i <= m && j <= r)
     {
         if(c[i] <= c[j])p[k ++] = c[i ++];
         else 
         {
             p[k ++ ] = c[j ++];
             ans = (ans + m - i + 1) % 99999997;
         }
     }
     while(i <= m)p[k ++] = c[i ++];
     while(j <= r)p[k ++] = c[j ++];
     for(int i = l,u = 1;i <= r;++ i,++ u)
     {
         c[i] = p[u];
     }
     return ans;
 }
 ​
 int main ()
 {
     cin >> n;
     for(int i = 1;i <= n;++ i)
     {
         cin >> a[i].x;
         a[i].cnt = i;
     }
     for(int i = 1;i <= n;++ i)
     {
         cin >> b[i].x;
         b[i].cnt = i;
     }   
     sort (a + 1,a + n + 1,cmp);
     sort(b + 1,b + 1 + n,cmp);
     for(int i = 1;i <= n;++ i)
     {
         c[a[i].cnt] = b[i].cnt;
     }
     cout << merge_sort(1,n) << "\n";
     
     
     return 0;
 }
 ​

这里用一个类去存入,值和这个值在最初状态的位置;然后用sort函数加自定义比较方法;如此的结果是a[i]就是第i小,而a[i].cnt又保存了这个的原始位置;紧接着,c数组是存......后面要用到的模板,c[a中第几大的数,的原始位置] = b中第几大的数的位置,如此存完开始归并排序

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值