https://www.luogu.org/problem/P1908

沿用归并排序的思想求逆序对。

坑1:结果爆int型,需要用longlong

坑2:相对于归并排序,在比较的时候多了一个等号

举例说明归并排序解本题,例如有6个数,

36,87,99,   左区间范围是l到mid,下标用t1表示

1,2,50,     右区间范围是mid+1到r,下标用t2表示

分成2堆,两堆排好序,要合并。此时l=1,mid=3,t1=1; mid+1=4,r=6,t2=4;

比较36和1,选1,则左边还没有排序的数都和1构成逆序对,3个,36,87,99,mid-t1+1=3;

比较36和2,选2,则左边还没有排序的数都和2构成逆序对,3个,36,87,99,mid-t1+1=3;

比较36和50,选36,则没有构成逆序对;

比较87和50,选50,则左边还没有排序的数都和50构成逆序对,2个,87,99,mid-t1+1=2;

右区间已经排完,直接选左区间的数,没有构成逆序对。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<ctime>
#define ll long long
#define inf 0x3f3f3f3f
const double pi=3.1415926;
using namespace std; const int maxx=500005;
int a[maxx];///排序数组
int b[maxx];///原数组
int n;
ll ans=0; void cdq(int l,int r,int x[])///左右闭区间,x数组作为参数,传入
{
if(l==r)
return;//出口
int mid=(l+r)/2;
cdq(l,mid,x);
cdq(mid+1,r,x);
int t1=l,t2=mid+1;///左右指针
for(int i=l;i<=r;i++)
{
///(当前左子区间的值<=当前右区间的值 并且 左指针还没有超出左边的最大值) 或者 右边已经排完了 就取左边
if( (x[t1]<=x[t2] && t1<=mid) || t2>r )//被这个等于号坑了好久
a[i]=x[t1++];
else ///不取左就取右 个数则由for循环保证
{
a[i]=x[t2++];
ans+=(ll)(mid-t1+1);///如果左区间还有剩,那就是和 当前t2下标的这个数构成逆序对
}
}
for(int i=l;i<=r;i++)///对b数组也进行交换
x[i]=a[i];
} int main()///P1908
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
cdq(1,n,b);
printf("%lld\n",ans);
return 0;
}

P1908 逆序对-(cdq分治)的更多相关文章

  1. P3157 动态逆序对 CDQ分治

    动态逆序对 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3157 题意: 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对 ...

  2. [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...

  3. BZOJ 3295 动态逆序对 | CDQ分治

    BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...

  4. [CQOI2011]动态逆序对 CDQ分治

    洛谷上有2道相同的题目(基本是完全相同的,输入输出格式略有不同) ---题面--- ---题面--- CDQ分治 首先由于删除是很不好处理的,所以我们把删除改为插入,然后输出的时候倒着输出即可 首先这 ...

  5. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治

    题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...

  6. 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治

    [BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...

  7. bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)

    3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...

  8. BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]

    RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...

  9. BZOJ3295:[CQOI2011]动态逆序对(CDQ分治)

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  10. BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 1 ...

随机推荐

  1. oracle--报错 ORA-01003,ORA-09817,ORA-01075

    磁盘满了,删除旧文件,即可保证登入成功

  2. Python安装(64位Win8.1专业版)

    本文出处:http://www.cnblogs.com/leonwen/p/4700648.html 嗯,开始学Python. 我安装的是Python 2.7.10版本,安装的时候除了选了路径其他均n ...

  3. C++中vector小学习,顺便查了下<stdio.h>(或<cstdio>)

    今天看书,邻桌在看<C++ Primer>,拿过来看了一会儿.以前比较少用vector容器,看了下后,瞬间觉得好腻害的样子,就想试一下.嗯,就是试一下而已.(代码可能网上都差不多,有参考) ...

  4. 框架之jQuery妙用

    1.jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Ajax交 ...

  5. Linux 启动数据库报错:could not open parameter file init**.ora

    sqlplus /nolog.conn /as sysdba.startup命令后显示 SQL> startupORA-01078: failure in processing system p ...

  6. 使用numpy处理数组

    def fun_ndarray(): a = [[1,2,7], [-6,-2,-3], [-4,-8,-55] ] b = np.array(a) b = np.abs(b)#取数组的绝对值 pri ...

  7. parallels desktop 的新建虚拟机的步骤

    新建虚拟机的图   点击窗口-----控制中心--再点击控制中心的+号      

  8. 函数防抖节流的理解及在Vue中的应用

    防抖和节流的目的都是为了减少不必要的计算,不浪费资源,只在适合的时候再进行触发计算. 一.函数防抖 定义 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时:典型的案例就是输入搜索:输入 ...

  9. 初始认知学习 .net core 逐步加深

    1.一般用空项目练手 2.一般你已经有数据库的情况下使用如下的方式 开始生成类的操作 这里我使用的是Database First模式,使用工具Scaffold-DbContext(数据库上下文脚手架) ...

  10. Scanner 中next()和nexline()方法的区别

      在java实现字符窗口的输入时,很多人更喜欢选择使用扫描器scanner,它操作起来比较简单.在编程的过程中,我发现用scanner实现字符串的输入有两种方法,一种是next(),另一种是next ...