[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

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<algorithm>
  6. using namespace std;
  7. int now[100100],c[100100],n,m,i,j,k;
  8. struct nums{
  9. int num,d;
  10. }a1[100100],a2[100100];
  11. inline int rd(){
  12. int x=0;
  13. char c=getchar();
  14. bool f=false;
  15. while(!isdigit(c)){
  16. if(c=='-') f=true;
  17. c=getchar();
  18. }
  19. while(isdigit(c)){
  20. x=(x<<1)+(x<<3)+(c^48);
  21. c=getchar();
  22. }
  23. return f?-x:x;
  24. }
  25. inline int lowbit(int x){return x&-x;}
  26. void add(int x){
  27. while(x<=n){
  28. c[x]+=1;
  29. x+=lowbit(x);
  30. }
  31. }
  32. int sum(int x){
  33. int ret=0;
  34. while(x>0){
  35. ret+=c[x];
  36. x-=lowbit(x);
  37. }
  38. return ret;
  39. }
  40. bool cmp(nums x,nums y){
  41. return x.num<y.num;
  42. }
  43. int main(){
  44. memset(c,0,sizeof(c));
  45. n=rd();
  46. for(i=1;i<=n;++i){
  47. a1[i].num=rd();
  48. a1[i].d=i;
  49. }
  50. for(i=1;i<=n;++i){
  51. a2[i].num=rd();
  52. a2[i].d=i;
  53. }
  54. sort(a1+1,a1+1+n,cmp);
  55. sort(a2+1,a2+1+n,cmp);
  56. for(i=1;i<=n;++i) now[a1[i].d]=a2[i].d;
  57. long long ans=0;
  58. for(i=n;i>0;--i){
  59. add(now[i]);
  60. ans=(ans+sum(now[i]-1))%99999997;
  61. }
  62. printf("%lld\n",ans);
  63. return 0;
  64. }

[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. Python入门:逻辑判断与运算符

    这是关于Python的第6篇文章,主要介绍下逻辑判断与运算符. (一) 逻辑判断: 如果要实现一个复杂的功能程序,逻辑判断必不可少.逻辑判断的最基本标准:布尔类型. 布尔类型只有两个值:True和Fa ...

  2. 爬虫学习之-scrapy交互式命令

    scrapy shell https:///www.baidu.com  会启动爬虫请求网页 view(response) 会在浏览器打开请求到的临时文件 response.xpath("/ ...

  3. HUAS 2017暑假第六周比赛-题解

    A.Parenthesis 括号匹配的问题有一种经典的做法. 将左括号看成1,右括号看成-1,做一遍前缀和sum. 括号序列是合法的当且仅当\(sum[n]=Min(sum[1],sum[2].... ...

  4. Android CollapsingToolbarLayout

    第一次看到这种用户体验是在Google Play Store App的应用详情的Activity中. 大的Banner图,能第一时间吸引用户的眼球,用不一样的Banner大图更具个性化的展示内容.图总 ...

  5. P2303 [SDOi2012]Longge的问题

    题目描述 Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N). 输入输出格式 输入格式: 一 ...

  6. linux系统下 git 使用教程

    一.初始化 1.首先安装git软件,安装环境是centos 7.x下的云服务器.使用命令: #yum install git 2.设置用户名和邮箱(必须): # git config --global ...

  7. 洛谷 P4091 [HEOI2016/TJOI2016]求和 解题报告

    P4091 [HEOI2016/TJOI2016]求和 题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: \[ f(n)=\sum_{i=0}^n\ ...

  8. APK反编译之二:工具介绍

    前面一节我们说过,修改APK最终是通过修改smali来实现的,所以我们接下来介绍的工具就是如何把APK中的smali文件获取出来,当然同时也需要得到AndroidManifest.xml等文件.直接修 ...

  9. Android Studio & eclipse 调试技巧

    如上图设置多个断点,开启调试.想跨断点移动到下一个断点,点击如下图1箭头,程序将运行一个断点到下一个断点之间需要执行的代码.如果后面代码没有断点,再次点击该按钮将会执行完程序.点击箭头2指向的按钮,可 ...

  10. bzoj : 4504: K个串 区间修改主席树

    4504: K个串 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 268  Solved: 110[Submit][Status][Discuss] ...