题目描述

涵涵有两盒火柴,每盒装有n 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为 ∑ni=1(ai−bi)2 ∑ i = 1 n ( a i − b i ) 2 \sum_{i=1}^n(a_i-b_i)^2
其中 ai a i a_i表示第一列火柴中第 i i i 个火柴的高度,bi" role="presentation" style="position: relative;">bibib_i表示第二列火柴中第 i i i个火柴的高度。
每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99999997取模的结果。

输入格式:

共三行,第一行包含一个整数n,表示每盒中火柴的数目。
第二行有n个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。
第三行有n个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。

输出格式:

一个整数,表示最少交换次数对 99999997 取模的结果。
【数据范围】

对于10% 的数据,1≤n≤10" role="presentation" style="position: relative;">1≤n≤101≤n≤10 1 ≤ n ≤ 10
对于30% 的数据, 1≤n≤100 1 ≤ n ≤ 100 1 ≤ n ≤ 100
对于60%的数据, 1≤n≤1000 1 ≤ n ≤ 1000 1 ≤ n ≤ 1000
对于100% 的数据, 1≤n≤100000,0≤火柴高度≤maxlongint 1 ≤ n ≤ 100000 , 0 ≤ 火 柴 高 度 ≤ m a x l o n g i n t 1 ≤ n ≤ 100000,0≤ 火柴高度 ≤ maxlongint


题目分析

首先不难想到a序列的第k小与b序列的第k小分别对应就能达到答案要求

将序列a,b做一些类似离散化的处理
先给序列中每个数标上编号,然后按原来的权值排序

这样a,b都变成了1-n的排列
现在问题可以转化为最少将b做多少次相邻元素的交换可以与a完全相同

我们设数组 c[a[i]]=b[i] c [ a [ i ] ] = b [ i ] c[a[i]]=b[i]
若b数组与a数组完全相同,则有 c[a[i]]=a[i] c [ a [ i ] ] = a [ i ] c[a[i]]=a[i]
即 c[i]=i c [ i ] = i c[i]=i

也就是说要让c变成1-n的升序排列
这时答案已经很显然了
就是求c数组的逆序对数


#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long lt;
#define lowbit(x) ((x)&(-x))int read()
{int f=1,x=0;char ss=getchar();while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}return f*x;
}const int maxn=100010;
const int mod=99999997;
int n;
struct node{int x,pos;}a[maxn],b[maxn];
int c[maxn];
int sum[maxn],ans;
bool cmp(node aa,node bb){return aa.x<bb.x;}void add(int x)
{for(int i=x;i<=n;i+=lowbit(i))sum[i]++;
}int qsum(int x)
{int res=0;for(int i=x;i>0;i-=lowbit(i))res+=sum[i];return res;
}int main()
{n=read();for(int i=1;i<=n;++i)a[i].x=read(),a[i].pos=i;for(int i=1;i<=n;++i)b[i].x=read(),b[i].pos=i;sort(a+1,a+1+n,cmp); sort(b+1,b+1+n,cmp);for(int i=1;i<=n;++i)c[a[i].pos]=b[i].pos;for(int i=n;i>=1;--i){ans+=qsum(c[i]-1); ans%=mod;add(c[i]);}printf("%d",ans);return 0;
}

洛谷 P1966 火柴排队【树状数组】相关推荐

  1. 洛谷 P1966 火柴排队

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

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

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

  3. 洛谷 - P2617 Dynamic Rankings(树状数组套主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,再给出 m 次操作: Q l r k:返回区间 [ l , r ] 内第 k 大的数 C x y:令 a[ x ] = y 题目分析:其实 ...

  4. 洛谷 P2357 守墓人(树状数组)

    树状数组区间更新,区间查询的入门好题 const int N=2e5+5;int i,j,k;int n,m,t;ll a[N]; ll c[N][2];ll sum[N];void add(int ...

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

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

  6. 洛谷P1966 火柴排队

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

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

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

  8. 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)

    解题思路: 首先我们知道交换两个数a[l]和a[r]a[l]和a[r]a[l]和a[r]影响到的区间是[l+1,r−1][l+1,r-1][l+1,r−1] 对于a[l]a[l]a[l],我们要减去[ ...

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

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

最新文章

  1. C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名...
  2. java 假设当前时间_Java如何比较当前时间是否在两个时间范围内
  3. 天翼云从业认证(4.10)网络直播场景解决方案(CDN)
  4. Automatic IE Testing With Python
  5. asp.net php 哪个好,ASP.NET、JSP和PHP究竟哪个好
  6. 大型Javascript应用架构的模式(译文)
  7. 用户访问一个网站的全部过程
  8. Android访问php webservice
  9. 多态加opp内置函数
  10. 直方图均衡化的代码解析
  11. swiftui动画之tab自定义切换动画_骨骼动画制作|万彩骨骼大师
  12. linux以命令行下配置连接wlan无线网卡
  13. nyoj810 贪心的嘿嘿(想弄死这出题的)
  14. 高等代数(邱维声):高等代数的研究对象
  15. 东软c语言课后习题,C语言笔试题及参考答案-东软集团
  16. 实现用python给微信指定联系人在指定时间发送消息(仅供学习)
  17. 地理中经纬度的英文名称
  18. 运用jmeter做接口与性能测试
  19. 踩坑指南!pytorch1.2.0安装!又是猛男落泪的一天!
  20. python生成器能用while吗_Python:在while循环中使用生成器

热门文章

  1. 最新kali之clang
  2. 黄静致华硕计算机总公司董事长的一封信
  3. 原创:《Python之路实战40篇》PDF高清版,限时下载!
  4. C# NanoFramework 开发单片机嵌入式之 ESP32
  5. 脂肪肝的饮食保健[ZT]
  6. cocos2dx骨骼动画Armature源码分析(三)
  7. 查缺补漏系统学习 EF Core 6 - 批量操作
  8. AC68U梅林固件,从ipv6设置到写脚本手动绑定ddns,通过单ipv6实现公网访问
  9. Pytorch的RELU函数
  10. 前端开发需要学习什么?(非技术栈)