磕了瓶魔爪。

题目描述

你有两个长度为 NNN 的数组 a,ba,ba,b,试重新排列 aaa 数组使得S=∑i=1n(ai−bi)2S=\sum_{i=1}^{n}{(a_i-b_i)^2}S=i=1∑n​(ai​−bi​)2的值最小。你可且仅可以交换相邻的两个数。求最小交换数对 99,999,99799,999,99799,999,997 取模的值。

Solution

容易得到(∑i=1nai)2+(∑i=1nbi)2=S−2∑i=1naibi(\sum_{i=1}^{n}{a_i})^2+(\sum_{i=1}^{n}{b_i})^2=S-2\sum_{i=1}^{n}{a_ib_i}(i=1∑n​ai​)2+(i=1∑n​bi​)2=S−2i=1∑n​ai​bi​

显然前几项都是定值,我们只能在最后一项中做文章。

注意到,将 a,ba,ba,b 数组排序后,aia_iai​ 与 bib_ibi​ 配对一定最优(反证法证明)。于是先离散化,然后排序,树状数组求逆序对个数即可。时间复杂度 O(nlog⁡n)O(n\log n)O(nlogn)。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> const int MAXN=100010;
const int MOD=99999997; int n;
struct node{
int d,id;
friend bool operator<(const node a,const node b){
return a.d<b.d;
}
}a[MAXN],b[MAXN];
int c[MAXN];
int bk[MAXN]; void Sort(){
//此处写的较为繁琐,但是可读性强
std::sort(a+1,a+n+1);
for(int i=1;i<=n;++i)
c[a[i].id]=i;
for(int i=1;i<=n;++i)
a[i].id=c[i];
std::sort(b+1,b+n+1);
for(int i=1;i<=n;++i)
c[b[i].id]=i;
for(int i=1;i<=n;++i)
b[i].id=c[i];
for(int i=1;i<=n;++i)
c[a[i].id]=i;
for(int i=1;i<=n;++i)
a[i].id=c[b[i].id];
}
int tree[MAXN];
int lowbit(int x){
return x&(-x);
}
void change(int x,int y){
while(x<=n){
tree[x]+=y;
x+=lowbit(x);
}
}
int que(int x){
int cnt=0;
while(x){
cnt+=tree[x];
x-=lowbit(x);
}
return cnt;
}
int query(int l,int r){
return que(r)-que(l-1);
}
//求逆序对个数
void Calc(){
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;++i)
bk[a[i].id]=i;
int cnt=0;
for(int i=1;i<=n;++i){
change(bk[i],1);
cnt=(cnt+query(bk[i]+1,n))%MOD;
}
printf("%d",cnt);
}
inline int read(){
int x=0; char c;
do c=getchar(); while(c<'0'||c>'9');
while(c>='0'&&c<='9')
x=x*10+c-48,c=getchar();
return x;
}
int main(){
n=read();
for(int i=1;i<=n;++i){
a[i].d=read();
a[i].id=i;
}
for(int i=1;i<=n;++i){
b[i].d=read();
b[i].id=i;
}
Sort();
Calc();
}

最新文章

  1. js时间戳与日期格式之间的转换
  2. ECMAScript
  3. InnoDB全文索引:N-gram Parser【转】
  4. laravel框架总结(八) -- ORM模型
  5. Eclipse 离线安装ADT
  6. Mac下手动安装Chromedriver.exe
  7. 实现毛玻璃模糊效果/DRNRealTimeBlur
  8. 【C++沉思录】句柄2
  9. Mysql自定义函数总结
  10. spring error
  11. 在python中使用zookeeper管理你的应用集群
  12. ObjectiveC中的block用法解析
  13. 使用NFS安装oracle软件
  14. 用简单的代码让一组静态图片变成gif动画
  15. 用好lua+unity,让性能飞起来——luajit集成篇/平台相关篇
  16. 【Unity】11.8 关节
  17. springmvc学习笔记一框架的理解
  18. Odoo中的甘特图
  19. Starting nginx: nginx: [emerg] bind() to 0.0.0.0:8088 failed (13: Permission denied) nginx 启动失败
  20. django.db.utils.OperationalError: (1071, &#39;Specified key was too long; max key length is 767 bytes&#39;)

热门文章

  1. JavaEE就业学习路线(给初学者以及自学者一个学习方向)
  2. PTA A1009&amp;A1010
  3. 5分钟学linux命令之split
  4. 0x7fffffff的意思
  5. Java基本数据类型转换及运算符
  6. 05、Linux通配符、转义字符、环境变量
  7. Spring 梳理 - 视图解析器 VS 视图(View,ViewResolver)
  8. idea 设置jvm参数
  9. Mybatis面试题吐血总结
  10. python 列表,集合,字典,字符串的使用