随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

涵涵有两盒火柴,每盒装有 nn 根火柴,每根火柴都有一个高度。

现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:∑(ai−bi)2

其中 ai表示第一列火柴中第 i个火柴的高度,bi表示第二列火柴中第 i个火柴的高度。

每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数

 

 最后是排序好的A,B ,p[a[i] ] =b[i ] ,要让 p 升序, 最小交换次数就是逆序对数

复制代码
#include <bits/stdc++.h>
using namespace std ;
 const int N=1e6+2;
 #define int long long
 
 struct node{ 
   int id; int v;
 };
  node a[N],b[N];
  int c[N],p[N]; 
  int n;
  
 int cmp(node t1,node t2){
     if(t1.v==t2.v) return t1.id<t2.id;
     return t1.v<t2.v;
 }
  inline int lowbit(int x){
      return x&-x;
  }
  void add(int x,int v){
       for(;x<=n;x+=lowbit(x)) c[x]+=v;
  }
  int qq(int x){
      int res=0;
      for(;x;x-=lowbit(x)) res+= c[x];
      return res;
  }
 signed main(){ 
     cin>>n;
     int i, s=0;
     for(i=1;i<=n;i++) cin>>a[i].v,a[i].id=i;
     for(i=1;i<=n;i++) cin>>b[i].v,b[i].id=i;
     
     sort(a+1,a+n+1,cmp) ;
    sort(b+1,b+n+1,cmp);
     
     for(i=1;i<=n;i++)
         p[a[i].id]=b[i].id;
     
     for(i=1;i<=n;i++){
         add(p[i],1); s+= i-qq(p[i]); s%=99999997;
     }
     cout<<s<<endl; 
 }
 
 
 
 
 
复制代码

 

 

 

posted on   towboat  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示