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

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

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

分析:
我们观察距离的定义:

所以我们要求sigma(a[i]*b[i])的最大值
显然让a中最大的乘以b中最大的可以得到最大值,而我们同时交换两个序列中的数字等价于一个序列不动,交换另一个序列中的数字

那么我们就可以构造出一个数组c,c[i]代表a序列不动,b序列中的第i个数字要移动到位置c[i]上,此时c中的逆序对个数就是我们的最小交换次数

可以用归并排序或者树状数组求

代码(树状数组):

#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define mod 99999997
long long tr[100010];
const int N=100005;
int n;
int bb[N];
void add(int k,ll num)
{while(k<=n){tr[k]=(tr[k]%mod+num%mod)%mod;k+=k&-k;}
}
int read(int k)
{ll sum=0;while(k){sum=(sum%mod+tr[k]%mod)%mod;k-=k&-k;}return sum;
}
struct node
{int val,pos;
}aa[100010];
bool cmp(node a,node b) {return a.val < b.val;}
struct premu1
{long long val;int num;
}a[N];
struct premu2
{int num;long long val;int tree;
}b[N];
bool cmpa(premu1 x,premu1 y) {return x.val<y.val;}
bool cmpb(premu2 x,premu2 y) {return x.val<y.val;}
bool cmpc(premu2 x,premu2 y) {return x.num<y.num;}
int sum[N];
int main()
{cin>>n;for(int i=1;i<=n;i++){scanf("%lld",&a[i].val);a[i].num=i;}for(int i=1;i<=n;i++){scanf("%lld",&b[i].val);b[i].num=i;}sort(a+1,a+n+1,cmpa);sort(b+1,b+n+1,cmpb);for(int i=1;i<=n;i++) b[i].tree=a[i].num;sort(b+1,b+n+1,cmpc);for(int i=1;i<=n;i++) sum[i]=b[i].tree;memset(tr,0,sizeof(tr));for(int i=1;i<=n;i++){aa[i].val = sum[i];aa[i].pos = i;}sort(aa+1,aa+1+n,cmp);int cnt = 1;for(int i=1;i<=n;i++){if(i != 1 && aa[i].val != aa[i-1].val)cnt++;bb[aa[i].pos] = cnt;}ll summ = 0;for(int i=1;i<=n;i++){add(bb[i],1);summ=(summ+(i - read(bb[i]))%(ll)99999997)%(ll)99999997;}printf("%lld\n",summ);return 0;
}

[NOIP2013][逆序对]火柴排队相关推荐

  1. [NOIp2013] luogu P1966 火柴排队

    磕了瓶魔爪. 题目描述 你有两个长度为 N N N 的数组 a , b a,b a,b,试重新排列 a a a 数组使得 S = ∑ i = 1 n ( a i − b i ) 2 S=\sum_{i ...

  2. 【NOIP2013】【Luogu1966】火柴排队(逆序对)

    problem 给你两个长为n的序列 最小化∑ni=1(a[i]+b[i])2∑i=1n(a[i]+b[i])2 \sum_{i=1}^n(a[i]+b[i])^2的值,答案%99999997. so ...

  3. 水题 逆序对 NOIP 2013 火柴排队

    题目如下 题目描述 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ,其中 a ...

  4. 【逆序对相关/数学】【P1966】【NOIP2013D1T2】 火柴排队

    传送门 Description 涵涵有两盒火柴,每盒装有 $n$ 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum ...

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

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

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

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

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

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

  8. 【NOIP2013提高组】火柴排队

    题目背景 NOIP2013 提高组 Day1 试题 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定 ...

  9. 刷题总结——火柴排队(NOIP2013)

    题目: 题目背景 NOIP2013 提高组 Day1 试题 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间 ...

最新文章

  1. svcagent32.exe,javaM.exe木马查杀解决方案 (转Ad0.cn)
  2. CF-311B Cats Transport(斜率优化DP)
  3. python基础代码库-python基础:一个非常简单且详细的多线程代码
  4. 描述符应用 -- 让python变成一个强类型的语言
  5. 两个python文件怎么联系在一起_【新手求助】怎样把两个程序连接在一起?老师作业,谢谢啦...
  6. 清除WINDOW远程登录服务器的信息
  7. qt设置鼠标追踪后,鼠标还是需要点击后才能变样式
  8. 【bzoj】 1412: [ZJOI2009]狼和羊的故事
  9. list转json的时候,关于date转换的问题
  10. JAVA能写大型游戏么?不能?
  11. zoom会议背景设置,zoom手机背景怎么设置
  12. Google adsense帐户被封到解封全过程
  13. html好看特效代码,教你制作漂亮的HTML代码特效贴
  14. ArcMap打不开ENVI的img格式问题解决
  15. 7-5 sdust-Java-学生成绩读取与排序 (22分)
  16. Spring Boot Post接口数据加解密
  17. mysql服务怎么启动和关闭?
  18. 王者荣耀英雄简介-1
  19. Source Insight 4.0安装教程(附上安装包及破解文件)
  20. 算法和数据结构(Java语言)

热门文章

  1. oracle序列归一,Oracle系统架构
  2. SDP零信任网络安全架构
  3. 学习C++,如果没看过这篇文章,就太失败了啊!
  4. 实验室第二周工作总结及计划表
  5. 我的世界服务器开发教程第三章——插件与vault挂钩并建立收费换皮肤GUI
  6. 2023年12306购票平台自动化购票终|解决乘客选择与车票提交(附自动化购票完整源代码与演示视频)
  7. 烈火兄发布的GHOST 11 (11.0.1.1533) 六合一版本
  8. 短语,直接短语,素短语与最左素短语(语法树求法)
  9. MySQL中多表连接查询总结与实践
  10. 桌面图标出现蓝底怎么办