[NOIP2013][逆序对]火柴排队
题目: 涵涵有两盒火柴,每盒装有 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][逆序对]火柴排队相关推荐
- [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 ...
- 【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 ...
- 水题 逆序对 NOIP 2013 火柴排队
题目如下 题目描述 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ,其中 a ...
- 【逆序对相关/数学】【P1966】【NOIP2013D1T2】 火柴排队
传送门 Description 涵涵有两盒火柴,每盒装有 $n$ 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum ...
- 洛谷P1966 火柴排队(逆序对)
题意 题目链接 Sol 不算很难的一道题 首先要保证权值最小,不难想到一种贪心策略,即把两个序列中rank相同的数放到同一个位置 证明也比较trivial.假设\(A\)中有两个元素\(a, b\), ...
- 洛谷P1966 火柴排队(cdq分治 + 逆序对)
2020.6.8 练二分了当然要练练分治,这些基础的处理手段真的还是蛮好用的. 这道题是问ai 和bi的平方和最小,最少需要的相邻的交换次数.手动模拟了一下感觉没什么思路.但是后来注意到每次只能移动相 ...
- NOIP2013 火柴排队 [洛谷P1966]
NOIP2013 火柴排队 [洛谷P1966] 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之 ...
- 【NOIP2013提高组】火柴排队
题目背景 NOIP2013 提高组 Day1 试题 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定 ...
- 刷题总结——火柴排队(NOIP2013)
题目: 题目背景 NOIP2013 提高组 Day1 试题 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间 ...
最新文章
- svcagent32.exe,javaM.exe木马查杀解决方案 (转Ad0.cn)
- CF-311B Cats Transport(斜率优化DP)
- python基础代码库-python基础:一个非常简单且详细的多线程代码
- 描述符应用 -- 让python变成一个强类型的语言
- 两个python文件怎么联系在一起_【新手求助】怎样把两个程序连接在一起?老师作业,谢谢啦...
- 清除WINDOW远程登录服务器的信息
- qt设置鼠标追踪后,鼠标还是需要点击后才能变样式
- 【bzoj】 1412: [ZJOI2009]狼和羊的故事
- list转json的时候,关于date转换的问题
- JAVA能写大型游戏么?不能?
- zoom会议背景设置,zoom手机背景怎么设置
- Google adsense帐户被封到解封全过程
- html好看特效代码,教你制作漂亮的HTML代码特效贴
- ArcMap打不开ENVI的img格式问题解决
- 7-5 sdust-Java-学生成绩读取与排序 (22分)
- Spring Boot Post接口数据加解密
- mysql服务怎么启动和关闭?
- 王者荣耀英雄简介-1
- Source Insight 4.0安装教程(附上安装包及破解文件)
- 算法和数据结构(Java语言)
热门文章
- oracle序列归一,Oracle系统架构
- SDP零信任网络安全架构
- 学习C++,如果没看过这篇文章,就太失败了啊!
- 实验室第二周工作总结及计划表
- 我的世界服务器开发教程第三章——插件与vault挂钩并建立收费换皮肤GUI
- 2023年12306购票平台自动化购票终|解决乘客选择与车票提交(附自动化购票完整源代码与演示视频)
- 烈火兄发布的GHOST 11 (11.0.1.1533) 六合一版本
- 短语,直接短语,素短语与最左素短语(语法树求法)
- MySQL中多表连接查询总结与实践
- 桌面图标出现蓝底怎么办