一开始竟然妄想用\(n^2\)的算法过这题,然而这是不可能的

所以只好写归并排序来求逆序対惹

比如将下面两个区间排序

3 4 7 9     1 5 8 10

首先将右区间的\(1\)取出,放到\(r_k\)中,此时 1 是比每个\(a_i\)中的元素都小,也就是说此时\(i\)的指针指向\(a_1\)的位置,此刻得到的逆序对的数量为\(4\);\(r_k\)= 1;

以此类推,直到进行完归并排序,每次合并都会求出逆序对的数目,即\(mid-i+1\),最后每次将\(ans\)加上\(mid−i+1\)即可得到

直接上代码

#include<bits/stdc++.h>
using namespace std;
int n;
int a[500010],t[500010];
long long ans=0;//存逆序对的个数
inline int read()
{
int tot=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
tot=(tot<<1)+(tot<<3)+c-'0';
c=getchar();
}
return tot*f;
}
inline void midsort(int l,int r)//归并排序
{
if(l==r)return;//只有一个数
int mid=(l+r)>>1;//去中间数
midsort(l,mid);midsort(mid+1,r);//分开
int i=l,j=mid+1,k=l;
while(i<=mid&&j<=r)//合并两个序列
{
if(a[i]<=a[j])t[k++]=a[i++];
else
{
t[k++]=a[j++];
ans+=(long long)mid-i+1;//顺便求一波逆序对
}
}
while(i<=mid)t[k++]=a[i++];
while(j<=r)t[k++]=a[j++];//把剩下的合进去
for(int i=l;i<=r;i++)a[i]=t[i];//复制一遍,以便下一波操作
}
int main()
{
n=read();
for(int i=1;i<=n;i++)a[i]=read();
midsort(1,n);
cout<<ans<<endl;
return 0;
}

洛谷 题解 P1908 【逆序对】的更多相关文章

  1. 洛谷P1521 求逆序对 题解

    题意: 求1到n的全排列中有m对逆序对的方案数. 思路: 1.f[i][j]表示1到i的全排列中有j对逆序对的方案数. 2.显然,1到i的全排列最多有(i-1)*i/2对逆序对,而对于f[i][j]来 ...

  2. 洛谷P1393 动态逆序对(CDQ分治)

    传送门 题解 听别人说这是洛谷用户的双倍经验啊……然而根本没有感觉到……因为另外的那题我是用树状数组套主席树做的……而且莫名其妙感觉那种方法思路更清晰(虽然码量稍稍大了那么一点点)……感谢Candy大 ...

  3. 洛谷P3157 动态逆序对 [CQOI2011] cdq分治

    正解:cdq分治 解题报告: 传送门! 长得有点像双倍经验还麻油仔细看先放上来QwQ! 这题首先想到的就直接做逆序对,然后记录每个点的贡献,删去就减掉就好 但是仔细一想会发现布星啊,如果有一对逆序对的 ...

  4. 洛谷P2513 [HAOI2009]逆序对数列

    P2513 [HAOI2009]逆序对数列 题目描述 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易 ...

  5. 洛谷 P1521 求逆序对

    题目描述 我们说(i,j)是a1,a2,…,aN的一个逆序对当且仅当i<j且ai>a j.例如2,4,1,3,5的逆序对有3个,分别为(1,3),(2,3),(2,4).现在已知N和K,求 ...

  6. bzoj2431 || 洛谷P1521 求逆序对

    考虑一下插⼊法 n<=100n<=100n<=100 f[i][j]f[i][j]f[i][j]表⽰111~iii的全排列有j个逆序对的⽅案数 f[i][j]=Σf[i−1][j−k ...

  7. 【洛谷P2513】逆序对数列

    前缀和.滚动数组优化dp f[i][j]表示前i个数,逆序对数为j的方案数 我们知道,在第k个位置放第i个数,单步得到的逆序对数为i-k 则在前i个数,最多能产生的逆序对数为i个,最少0个,均可转移到 ...

  8. 洛谷P1908 逆序对

    P1908 逆序对 2.2K通过 4.4K提交 题目提供者该用户不存在 标签云端 难度普及/提高- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 归并排序党注意了!数组要开… ...

  9. 「杂烩」精灵魔法(P1908逆序对弱化版)

    「杂烩」精灵魔法(P1908逆序对弱化版) 题面: 题目描述 \(Tristan\)解决了英灵殿的守卫安排后,便到达了静谧的精灵领地--\(Alfheim\) .由于$ Midgard$ 处在$ Al ...

随机推荐

  1. Greenplum table 之 appendonly表

    一.压缩表 1.appendonly压缩表的数据视图为pg_appendonly 2.appendonly在Greenplum后也可更新与删除

  2. Postgresql 物理备份冷备份 与 热备份

    一.冷备份 将数据库停下来,然后把数据库的PGDATA目录拷贝下来就可以了. PostgreSQL把与数据库实例有关的配置文件和数据文件都放在PGDATA目录下,所以做冷备份很简单. 二.热备份 热备 ...

  3. 十二.虚拟Web主机

    *********************** 修改apache默认的网页文件存放位置 ]# mkdir /var/www/myweb ]# echo "I am MyWeb" & ...

  4. 洛谷P1021邮票面值设计

    题目 一道很经典的搜索题,可以锻炼搜索的能力,比如可以用dfs覆盖加dp的方式来寻找+更新答案.而且还可以通过在递归中增加数组的方式来辅助搜索. #include <bits/stdc++.h& ...

  5. start-stop-daemon 守护进程管理

    start-stop-daemon 守护进程管理 start-stop-daemon 作为系统自带,简单实用 结合systemctl,用起来很是不错. 示例 PIDFILE=/var/run/ngin ...

  6. (6)打造简单OS-内存分页

    好长时间没有更新了,最近比较忙...... 内存分页可以放在C代码中,这样比较方便编写!即loader执行完后进入kernel_main函数之后在分配内存分页! 一.地址 讲到内存必然要讲到计算机中经 ...

  7. (转)hive调优(1) coding调优

    hive 调优(一)coding调优 本人认为hive是很好的工具,目前支持mr,tez,spark执行引擎,有些大公司原来封装的sparksql,开发py脚本,但是目前hive支持spark引擎(不 ...

  8. “可恶”的mariadb

    这是头一次用mariadb,听说是centos7自带的,本来本地用的好好地,今天想连接一下远程centos7主机上的mariadb,结果各种出错,痛不欲生,最后实在买办法只能卸载装mysql啦.稍微记 ...

  9. 认识wsgi

    WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义 ...

  10. RK3399 4G模块移远EC20移植调试

    转载请注明出处:https://www.cnblogs.com/lialong1st/p/11266330.html CPU:RK3399 系统:Android 7.1 1.通过串口打印或者adb获取 ...