题目描述

涵涵有两盒火柴,每盒装有 nn 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:\sum (a_i-b_i)^2∑(ai​−bi​)2

其中 a_iai​ 表示第一列火柴中第 ii 个火柴的高度,b_ibi​ 表示第二列火柴中第 ii 个火柴的高度。

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

输入格式

共三行,第一行包含一个整数 nn,表示每盒中火柴的数目。

第二行有 nn 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。

第三行有 nn 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。

输出格式

一个整数,表示最少交换次数对 10^8-3108−3 取模的结果。

输入输出样例

输入 #1复制

4
2 3 1 4
3 2 1 4

输出 #1复制

1

输入 #2复制

4
1 3 4 2
1 7 2 4

输出 #2复制

2

说明/提示

【输入输出样例说明一】

最小距离是00,最少需要交换 11 次,比如:交换第 11列的前22 根火柴或者交换第 22 列的前 22根火柴。

【输入输出样例说明二】

最小距离是 1010,最少需要交换 22 次,比如:交换第 11 列的中间 22 根火柴的位置,再交换第 22 列中后 22 根火柴的位置。

【数据范围】

对于 10\%10% 的数据, 1 \leq n \leq 101≤n≤10;

对于 30\%30% 的数据,1 \leq n \leq 1001≤n≤100;

对于 60\%60% 的数据,1 \leq n \leq 10^31≤n≤103;

对于 100\%100% 的数据,1 \leq n \leq 10^51≤n≤105,0 \leq0≤ 火柴高度 < 2^{31}<231。

上代码:

#include<bits/stdc++.h>
using namespace std;
#define re register
#define ll long long
#define il inline
#define dou double
#define un unsigned
il ll read()
{char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
#define N 100000+10
#define M 99999997
int n,ans;
struct number
{ll val,num;
};
number a[N],b[N];
ll bit[N],x[N];
il bool cmp(number x,number y)
{if(x.val==y.val)return x.num<y.num;return x.val<y.val;
}
il ll lowbit(int x)
{return x&(-x);
}
il void change(int x,int d)
{for(re int i=x;i<=n;i+=lowbit(i)){bit[i]+=d;bit[i]%=M;}
}
il ll query(int x)
{if(x==0)return 0;ll ret=0;for(re int i=x;i>=1;i-=lowbit(i)){ret+=bit[i];ret%=M;}   return ret;
}
int main()
{n=read();for(re int i=1;i<=n;i++){a[i].val=read();a[i].num=i;}for(re int i=1;i<=n;i++){b[i].val=read();b[i].num=i;}sort(a+1,a+n+1,cmp);sort(b+1,b+n+1,cmp);for(re int i=1;i<=n;i++)x[a[i].num]=b[i].num;for(re int i=1;i<=n;i++){change(x[i],1);ans+=i-query(x[i]);ans%=M;}cout<<ans<<endl;return 0;
}

洛谷P1966 火柴排队相关推荐

  1. 洛谷 P1966 火柴排队 —— 思路

    题目:https://www.luogu.org/problemnew/show/P1966 首先,一个排列相邻交换变成另一个排列的交换次数就是逆序对数: 随便画一画,感觉应该是排个序,大的对应大的, ...

  2. 洛谷 P1966 火柴排队【树状数组】

    题目描述 涵涵有两盒火柴,每盒装有n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为 ∑ni=1(ai−bi)2 ∑ i = 1 ...

  3. 洛谷 P1966 火柴排队

    题意 给定2个等长序列a.b,要求通过交换使 \[\sum_{i=1}^{n}(a_i-b_i)^2\] 最小. 分析 看着这个式子,我突然想到了方差.很明显,方差反应数据的波动程度,所以让数据集中就 ...

  4. 洛谷P1966 火柴排队(逆序对)

    题意 题目链接 Sol 不算很难的一道题 首先要保证权值最小,不难想到一种贪心策略,即把两个序列中rank相同的数放到同一个位置 证明也比较trivial.假设\(A\)中有两个元素\(a, b\), ...

  5. 洛谷P1966 火柴排队(cdq分治 + 逆序对)

    2020.6.8 练二分了当然要练练分治,这些基础的处理手段真的还是蛮好用的. 这道题是问ai 和bi的平方和最小,最少需要的相邻的交换次数.手动模拟了一下感觉没什么思路.但是后来注意到每次只能移动相 ...

  6. NOIP2013 火柴排队 [洛谷P1966]

    NOIP2013 火柴排队 [洛谷P1966] 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之 ...

  7. P1966 火柴排队题解

    P1966 火柴排队 题意:有两列火柴,各有各的高度,两两高度不同,每次只能交换相邻的数,问最少交换多少次,使得 ∑ ( a i − b i ) 2 \sum (a_i-b_i)^2 ∑(ai​−bi ...

  8. 洛谷 P1149 火柴棒等式(太suang络吧)

    题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=CA+B=C"的等式?等式中的AA.BB.CC是用火柴棍拼出的整数(若该数非零,则最高位不能是00).用火柴棍拼数字0-90 ...

  9. 【洛谷P1966】火柴排队

    两列排序后将编号一一对应 归并排序求逆序对 (每一次交换就去掉一个逆序对) 1 #include<cstdio> 2 #include<cstring> 3 #include& ...

最新文章

  1. 帝国cms万能通用api二次开发核心包使用说明
  2. substring和charindex的使用注意
  3. 【设计模式】依赖倒转原则
  4. NOIP2018退役记
  5. VLC 学习计划---文档阅读
  6. react销毁方法钩子0_React钩子:使用React状态的新方法
  7. 南京市儿童医院用医保身份(医保通道)网上预约挂号以及取号、付费看病流程...
  8. mariadb用户群体mysql_MySQL/MariaDB用户账户管理
  9. Vue+Element+Springboot实现图片上传
  10. Java创建一个学生类
  11. DreamweaverCS6搭建配置php本地站点(图文教程)- 教程篇
  12. HTML table 和 div
  13. 手把手教你写一个spring IOC容器
  14. python3中input()方法报错traceback变量未定义的解决方法
  15. ChartControl控件绘制柱状图
  16. 旋转矩阵到旋转角的计算
  17. Cocos2d-x《雷电大战》(4)-策略模式实现不同子弹切换!!
  18. 解决Idea中项目模块没有蓝色方块
  19. javaWeb通过servlet实现注册登陆
  20. python显示图片image_用Python语言显示图片的倒影效果

热门文章

  1. libvirt 的使用
  2. UVa12325 12325 - Zombie‘s Treasure Chest(思路+代码)
  3. 2022年上海应届生落户公司要求!打分不够72的同学可以考虑!
  4. CFile用法与实现
  5. Mac环境下安装MongoDB数据库
  6. 张一鸣:每个逆袭的年轻人,都具备的底层能力
  7. 朴素贝叶斯算法及其实战
  8. TIA Portal面向对象编程入门
  9. 批量启动docer容器shell脚本
  10. SCORM标准的LMS