洛谷P1966 火柴排队
题目描述
涵涵有两盒火柴,每盒装有 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 火柴排队相关推荐
- 洛谷 P1966 火柴排队 —— 思路
题目:https://www.luogu.org/problemnew/show/P1966 首先,一个排列相邻交换变成另一个排列的交换次数就是逆序对数: 随便画一画,感觉应该是排个序,大的对应大的, ...
- 洛谷 P1966 火柴排队【树状数组】
题目描述 涵涵有两盒火柴,每盒装有n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为 ∑ni=1(ai−bi)2 ∑ i = 1 ...
- 洛谷 P1966 火柴排队
题意 给定2个等长序列a.b,要求通过交换使 \[\sum_{i=1}^{n}(a_i-b_i)^2\] 最小. 分析 看着这个式子,我突然想到了方差.很明显,方差反应数据的波动程度,所以让数据集中就 ...
- 洛谷P1966 火柴排队(逆序对)
题意 题目链接 Sol 不算很难的一道题 首先要保证权值最小,不难想到一种贪心策略,即把两个序列中rank相同的数放到同一个位置 证明也比较trivial.假设\(A\)中有两个元素\(a, b\), ...
- 洛谷P1966 火柴排队(cdq分治 + 逆序对)
2020.6.8 练二分了当然要练练分治,这些基础的处理手段真的还是蛮好用的. 这道题是问ai 和bi的平方和最小,最少需要的相邻的交换次数.手动模拟了一下感觉没什么思路.但是后来注意到每次只能移动相 ...
- NOIP2013 火柴排队 [洛谷P1966]
NOIP2013 火柴排队 [洛谷P1966] 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之 ...
- P1966 火柴排队题解
P1966 火柴排队 题意:有两列火柴,各有各的高度,两两高度不同,每次只能交换相邻的数,问最少交换多少次,使得 ∑ ( a i − b i ) 2 \sum (a_i-b_i)^2 ∑(ai−bi ...
- 洛谷 P1149 火柴棒等式(太suang络吧)
题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=CA+B=C"的等式?等式中的AA.BB.CC是用火柴棍拼出的整数(若该数非零,则最高位不能是00).用火柴棍拼数字0-90 ...
- 【洛谷P1966】火柴排队
两列排序后将编号一一对应 归并排序求逆序对 (每一次交换就去掉一个逆序对) 1 #include<cstdio> 2 #include<cstring> 3 #include& ...
最新文章
- 帝国cms万能通用api二次开发核心包使用说明
- substring和charindex的使用注意
- 【设计模式】依赖倒转原则
- NOIP2018退役记
- VLC 学习计划---文档阅读
- react销毁方法钩子0_React钩子:使用React状态的新方法
- 南京市儿童医院用医保身份(医保通道)网上预约挂号以及取号、付费看病流程...
- mariadb用户群体mysql_MySQL/MariaDB用户账户管理
- Vue+Element+Springboot实现图片上传
- Java创建一个学生类
- DreamweaverCS6搭建配置php本地站点(图文教程)- 教程篇
- HTML table 和 div
- 手把手教你写一个spring IOC容器
- python3中input()方法报错traceback变量未定义的解决方法
- ChartControl控件绘制柱状图
- 旋转矩阵到旋转角的计算
- Cocos2d-x《雷电大战》(4)-策略模式实现不同子弹切换!!
- 解决Idea中项目模块没有蓝色方块
- javaWeb通过servlet实现注册登陆
- python显示图片image_用Python语言显示图片的倒影效果