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;
}

最新文章

  1. eclipse设置快速提示符
  2. Linux rsync实现断点续传
  3. 百度Android定位SDK获取位置
  4. JavaScript 开发者经常忽略或误用的七个基础知识点
  5. Wamp 设置 www 目录
  6. bash检查文件格式
  7. jQuery $.extend() 和 $.fn.extend() 用法
  8. CodeForces - 405C
  9. 基于Elasticsearch开发时的注意事项备忘
  10. hdu 5014 Number Sequence
  11. 正则表达式替换img标签src值!!!
  12. django的model对象转化成dict
  13. C#句柄使用
  14. 华为HCNA教程(笔记)
  15. 认识CLR [《CLR via C#》读书笔记]
  16. Linux中的shell函数编写
  17. 利用PHPExcel读取Excel的数据和导出数据到Excel
  18. 安卓开发遇到Error:Execution failed for task &#39;:app:transformClassesWithDexForDebug&#39;.
  19. 机器学习 GBDT+xgboost 决策树提升
  20. 微软 WPC 2014 合作伙伴keynote

热门文章

  1. PurpleAir空气质量数据采集
  2. THUSC2019去不了记
  3. python学习--大数据与科学计算第三方库简介
  4. 单片机成长之路(51基础篇) - 023 N76e003 系统时钟切换到外部时钟
  5. 在Visual studio上发布web项目,并添加到IIS服务器上。
  6. 在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证
  7. C#集合中根据多个字段分组 group by linq表达式
  8. Python【day 9】函数入门2
  9. v-bind 属性绑定
  10. 基于 ECharts 封装甘特图并实现自动滚屏