[NOIP2013提高&洛谷P1966]火柴排队

Description

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

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

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

输入格式:

共三行,第一行包含一个整数 n,表示每盒中火柴的数目。

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

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

输出格式:

输出共一行,包含一个整数,表示最少交换次数对 99,999,997 取模的结果。

Solution

1.要是两列火柴距离最小,那么我们就应让所有的(ai-bi)^2最小,即ai与bi的差最小,考虑贪心,应该让在序列中从小到大排序后序号相同的数相减,因为如果两数列中两个数在各自数列中从小到大序号相等,那么如果这两个数不做差分别与另一个数做差,差的平方显然是要比原来大的。

2.那么我们考虑如何将数列整理成想要的:我们建立一个新的数列,以离散后的第一个数列该项为下标,以离散后第二个数列对应的项为值建立,相当于以第一个数列为关键字排序第二个数列,然后跑一遍逆序对即可。

树状数组求逆序对的方法参考我的博文:http://www.cnblogs.com/COLIN-LIGHTNING/p/8621294.html

Code

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; int now[100100],c[100100],n,m,i,j,k;
struct nums{
int num,d;
}a1[100100],a2[100100]; inline int rd(){
int x=0;
char c=getchar();
bool f=false;
while(!isdigit(c)){
if(c=='-') f=true;
c=getchar();
}
while(isdigit(c)){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return f?-x:x;
} inline int lowbit(int x){return x&-x;} void add(int x){
while(x<=n){
c[x]+=1;
x+=lowbit(x);
}
} int sum(int x){
int ret=0;
while(x>0){
ret+=c[x];
x-=lowbit(x);
}
return ret;
} bool cmp(nums x,nums y){
return x.num<y.num;
}
int main(){
memset(c,0,sizeof(c));
n=rd();
for(i=1;i<=n;++i){
a1[i].num=rd();
a1[i].d=i;
}
for(i=1;i<=n;++i){
a2[i].num=rd();
a2[i].d=i;
}
sort(a1+1,a1+1+n,cmp);
sort(a2+1,a2+1+n,cmp);
for(i=1;i<=n;++i) now[a1[i].d]=a2[i].d;
long long ans=0;
for(i=n;i>0;--i){
add(now[i]);
ans=(ans+sum(now[i]-1))%99999997;
}
printf("%lld\n",ans);
return 0;
}

[NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)的更多相关文章

  1. NOIP 2013 洛谷P1966 火柴排队 (树状数组求逆序对)

    对于a[],b[]两个数组,我们应选取其中一个为基准,再运用树状数组求逆序对的方法就行了. 大佬博客:https://www.cnblogs.com/luckyblock/p/11482130.htm ...

  2. [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)

    [NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...

  3. 洛谷p1966火柴排队题解

    ps:鉴于你们的蒟蒻yxj实在太蒻辽, 所以, 看不懂也是正常的........ 树状数组 xxy学姐给我们讲的树状数组, 她讲的真的是太好啦!qwq!吹爆xxy 然后, 为了巩固自己, 硬着头皮写题 ...

  4. 洛谷 P1966 火柴排队 题解

    归并排序 很玄学的一道题目,用另类的方法求出逆序对的数量就可以AC 我的思路是这样的: 按照题目,输入数据用两个数组a,b储存, 同时,用另外两个数组c,d分别对应前面两个a,b储存, 就是前面两个的 ...

  5. 洛谷——P1966 火柴排队&&P1774 最接近神的人_NOI导刊2010提高(02)

    P1966 火柴排队 这题贪心显然,即将两序列中第k大的数的位置保持一致,证明略: 树状数组求逆序对啦 浅谈树状数组求逆序对及离散化的几种方式及应用 方法:从前向后每次将数插入到bit(树状数组)中, ...

  6. 洛谷 P1966 火柴排队

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

  7. 洛谷——P1966 火柴排队

    https://www.luogu.org/problem/show?pid=1966 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列 ...

  8. 洛谷 P5057 [CQOI2006]简单题 (树状数组,位运算)

    题意:有一个长度为\(n\)的数组,进行\(m\)次操作,每次读入一个值\(t\),如果\(t=1\),则将区间\([l,r]\)的数字反转,若\(t=2\),则查询下标为\(i\)的值. 题解:树状 ...

  9. 【题解】洛谷P1966 [NOIP2013TG] 火柴排队(树状数组+逆序对)

    次元传送门:洛谷P1966 思路 显然在两排中 每排第i小的分别对应就可取得最小值(对此不给予证明懒) 所以我们只在意两排的火柴是第几根 高度只需要用来进行排序(先把两个序列改成有序的方便离散化) 因 ...

随机推荐

  1. PHP面试经常被提到的问题

    1. Include 与 require的区别,require和require_once的效率哪个高? PHP在遇到include时就解释一次,如果页面中出现10次include,php就解释10次, ...

  2. command symbol & mac & emoji

    command symbol & mac & emoji how to input command symbol in mac ? https://apple.stackexchang ...

  3. javascript中boolean类型和其他类型的转换

    在javascript中,if语句括号中的表达式返回值可以是任何类型,即:if(a)中的a可以是boolean.number.string.object.function.undefined中的任何类 ...

  4. python利用unittest测试框架组织测试用例的5种方法

    利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...

  5. c语言基本数据类型(short、int、long、char、float、double)

    一 C 语言包含的数据类型 short.int.long.char.float.double 这六个关键字代表C 语言里的六种基本数据类型. 在不同的系统上,这些类型占据的字节长度是不同的: 在32 ...

  6. 【刷题】BZOJ 2959 长跑

    Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上 ...

  7. 洛谷 P4244 [SHOI2008]仙人掌图 II 解题报告

    P4244 [SHOI2008]仙人掌图 II 题目背景 题目这个II是和SHOI2006的仙人掌图区分的,bzoj没有. 但是实际上还是和bzoj1023是一个题目的. 题目描述 如果某个无向连通图 ...

  8. MacBook设置终端颜色,补全忽略大小写,设置命令别名alias,设置vim,设置显示git分支

    1.启用终端颜色 修改配置文件 $ vim .bash_profile #enables colorin the terminal bash shell export export CLICOLOR= ...

  9. zookeeper和PHP zookeeper和kafka 扩展安装

    http://blog.csdn.net/fenglailea/article/details/52458737#t3   目录(?)[-] 安装zookeeper 1直接安装zookeeper无须编 ...

  10. 用Gradle命令行编译Android工程

    在Android sdk 目录下的samples/android-21/ 文件夹下,任找一个工程,如果在命令行直接编译 可能会报这种错误:gradle buile.gradle FAILURE: Bu ...