$Noip2013/Luogu1966$ 火柴排队 贪心+离散化+逆序对
$Description$
给定等长的$a,b$两个序列.每次可以交换一个序列中相邻两个数.求最小的交换次数使得$\sum(a_i-b_i)^2$最小.
$Sol$
交换后的序列一定满足$a$序列中第$i$大的数和$b$序列中第$i$大的数对应.证明挺显然的就不说了,洛谷里的题解一定有的叭.然后把两个序列中的数离散化,把$b$序列中第$i$大的数转换成$a$序列中第$i$大的数所在的位置.于是问题就转化成了,$b$序列中交换多少次能变成$a$,又因为离散化后$a$序列是单增的,其实就是$1,2,3.....,n$.所以只要求此时$b$序列中的逆序对就好了.可以用归并排序或树状数组.
$Code$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define il inline
#define Rg register
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
#define yes(i,a,b) for(Rg int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define db double
#define inf 2147483647
using namespace std;
il int read()
{
Rg int x=0,y=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*y;
}
const int N=100010,mod=99999997;
int n,c[N],d[N],e[N];
ll as;
struct node{int w,pos,dx;}a[N],b[N];
il bool cmp1(node x,node y){return x.w<y.w;}
il bool cmp2(node x,node y){return x.pos<y.pos;}
il void lsh()
{
sort(a+1,a+n+1,cmp1);
sort(b+1,b+n+1,cmp1);
go(i,1,n)c[i]=a[i].pos;
go(i,1,n)b[i].dx=i;
sort(b+1,b+n+1,cmp2);
go(i,1,n)d[i]=c[b[i].dx];
}
il void gb(int l,int r)
{
if(l==r)return;
Rg int mid=(l+r)>>1,i=l,j=mid+1;
gb(l,mid);gb(mid+1,r);
go(k,l,r)
{
if((d[i]>d[j]&&j<=r)||i>mid)as=(as+(mid-i+1))%mod,e[k]=d[j++];
else e[k]=d[i++];
}
go(k,l,r)d[k]=e[k];
}
int main()
{
n=read();
go(i,1,n)a[i].w=read(),a[i].pos=i;
go(i,1,n)b[i].w=read(),b[i].pos=i;
lsh();
gb(1,n);
printf("%lld\n",as);
return 0;
}
随机推荐
- Laravel的请求声明周期
声明周期概述# 开始# public/index.php 文件是所有对Laravel应用程序的请求的入口点.而所有的请求都是经由你的Web服务器(Apache/Nginx) 通过配置引导到这个文件.i ...
- Sublime插件:增强篇
Sublime Text 如何安装插件详见:https://packagecontrol.io/installation WordCount:可以实时显示当前文件的字数. 安装后,后下角多出字数 En ...
- oracle用WHERE替代ORDER BY
ORDER BY 子句只在两种严格的条件下使用索引. ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. ORDER BY中所有的列必须定义为非空. WHERE子句使用的索引和 ...
- activiti 如何使用database前缀来区分activiti数据库和业务数据库
为什么80%的码农都做不了架构师?>>> 第一步是先集成好activiti,我使用的是5.22.0,使用springboot集成,pom文件如下: <parent> ...
- JavaScript 按位与和逻辑与
逻辑与操作符有两个和好(&&)表示,有两个操作数,如下面的例子所示: var result = true && false; 第一个操作数 第二个操作数 结果 tr ...
- 【转载】Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)
概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...
- Java反射机制(二):通过反射取得类的结构
在反射运用过程中,如果你想得到一个类的完整结构,那么就要使用到java.lang.reflect包中的几个类: · Constructor 表示类中的构造方法 · Field 表示类中的属性 · ...
- C#的选择语句
一.选择语句 if,else if是如果的意思,else是另外的意思,if'后面跟()括号内为判断条件,如果符合条件则进入if语句执行命令.如果不符合则不进入if语句.else后不用加条件,但是必须与 ...
- JS精度问题,解决方案 math.js
JS精度问题 Vue中使用 解决方案 math.js npm install mathjs import { create, all } from 'mathjs' const config = ...
- js对数组的元素分割
文章地址 https://www.cnblogs.com/sandraryan/ 不用方法(模拟方法) <script> var arr = ["hi",2,3,tru ...