首先对某人在未经冰少允许情况下登录冰少账号原模原样复制其代码并且直接提交的赤裸裸剽窃行为,并且最终被评为优秀作业提出抗议!

题目大意:

  给一个数组含n个数(1<=n<=5e5),求使用冒泡排序为递增序列时,最少交换次数为多少次。

题目分析:

  对于数组中任意两个数,若$i<j$且$ai>aj$,则ai与aj必然会进行交换使其变为顺序,因此只需要求逆序对数量即可。

  分享两种方法,第一种使用归并排序:

  对于数组进行递归分治,使用归并排序,在数组两侧合并的过程中,若右侧元素先入数组,则左侧剩余元素均比该元素小,因此可以在归并排序的过程中将逆序对数量求出。

  下面分享代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn=5e5+;
int arrcy[maxn],lef[maxn],rig[maxn];
ll ans=; void mergesort(int *,int ,int);
void merge(int *,int ,int,int); int main()
{
int n,i;
scanf("%d",&n);
for (i=;i<n;i++) scanf("%d",&arrcy[i]);
mergesort(arrcy,,n-);
printf("%lld\n",ans);
return ;
} void mergesort(int arrcy[],int l,int r)
{
if(l<r)
{
int m=(l+r)/;
mergesort(arrcy,l,m);
mergesort(arrcy,m+,r);
merge(arrcy,l,m,r);
}
return ;
} void merge(int arrcy[],int l,int m,int r)
{
int num1=m-l+,num2=r-m;
int i,j;
for (i=;i<num1;i++) lef[i]=arrcy[l+i];
for (i=;i<num2;i++) rig[i]=arrcy[m++i];
i=,j=;
for (int k=;k<r-l+;k++)
{
if(i>=num1||(j<num2&&lef[i]<=rig[j]))
{
arrcy[l+k]=rig[j++];
}
else
{
if(num2>j)
ans+=num2-j;
arrcy[l+k]=lef[i++];
}
}
}

  方法二:树状数组或线段树

  先将数组按大小进行离散化排序,从大到小,对于每个元素记录其位置,然后按数组元素大小从大到小,将其原始位置+1,后续操作时先计算1至该元素位置的和,即为与该元素的逆序对数量,进行求和即可。

  分享线段树代码:

  

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int,int> pii;
#define rep(i,x,y) for(int i=x;i<y;i++)
#define rept(i,x,y) for(int i=x;i<=y;i++)
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define dd(x) cout<<#x<<"="<<x<<" ";
#define de(x) cout<<#x<<"="<<x<<"\n";
#define mes(a,b) memset(a,b,sizeof a) const int maxn=5e5+;
pii arrcy[maxn];
class Tree
{
public:
int l,r;
ll sum;
}tree[maxn<<]; void build(int id,int l,int r);
void add(int id,int p,ll num);
ll query(int id,int l,int r); bool comp(const pii &s1,const pii &s2)
{
return s1.fi>s2.fi||(s1.fi==s2.fi&&s1.se>s2.se);
} int main()
{
int n;
scanf("%d",&n);
rept(i,,n)
{
arrcy[i].se=i;
scanf("%d",&arrcy[i].fi);
}
build(,,n);
ll ans=;
sort(arrcy+,arrcy++n,comp);
rept(i,,n)
{
ans+=query(,,arrcy[i].se);
add(,arrcy[i].se,);
}
printf("%lld\n",ans);
return ;
}
void build(int id,int l,int r)
{
tree[id].l=l;
tree[id].r=r;
tree[id].sum=;
if(l==r) return ;
int mid=(l+r)/;
build(id*,l,mid);
build(id*+,mid+,r);
}
void add(int id,int p,ll num)
{
if(tree[id].l>=p&&tree[id].r<=p)
{
tree[id].sum+=num;
return ;
}
if(tree[id].l>p||tree[id].r<p) return ;
if(tree[id*].r>=p) add(id*,p,num);
if(tree[id*+].l<=p) add(id*+,p,num);
tree[id].sum=tree[id*].sum+tree[id*+].sum;
} ll query(int id,int l,int r)
{
if(tree[id].l>=l&&tree[id].r<=r) return tree[id].sum;
if(tree[id].l>r||tree[id].r<l) return ;
ll s=;
if(tree[id*].r>=l) s+=query(id*,l,r);
if(tree[id*+].l<=r) s+=query(id*+,l,r);
return s;
}

FZU2018级算法第五次作业 m_sort(归并排序或线段树求逆序对)的更多相关文章

  1. FZU2018级算法第五次作业 missile(排序+枚举)

    在解题报告之前,首先对同一次作业中另外一题(求逆序对)某人在未经冰少允许情况下,擅自登录冰少账号,原模原样剽窃冰少代码,并且最终还被评为优秀作业的行为表示严正抗议! 题目大意: 二维平面上给出 n 个 ...

  2. FZU2018级算法第三次作业 3.16 station

    题目大意: 给出1-n共n个数的入栈顺序,可以随时出栈,求出栈的最大字典序. 输入示例 输出示例 51 2 3 4 5 5 4 3 2 1 54 2 5 3 1 5 3 2 4 1 题目分析: 假设目 ...

  3. 求逆序对常用的两种算法 ----归并排 & 树状数组

    网上看了一些归并排求逆序对的文章,又看了一些树状数组的,觉得自己也写一篇试试看吧,然后本文大体也就讲个思路(没有例题),但是还是会有个程序框架的 好了下面是正文 归并排求逆序对 树状数组求逆序对 一. ...

  4. FZU2018级算法第一次作业 1.1fibonacci (矩阵快速幂)

    题目 Winder最近在学习fibonacci 数列的相关知识.我们都知道fibonacci数列的递推公式是F(n)=F(n-1)+F(n-2)(n>=2 且n 为整数). Winder想知道的 ...

  5. FZU2018级算法第二次作业 2.10 逆序数(权值线段树)

    题目: Nk 最近喜欢上了研究逆序数,给出一个由 1…n 组成的数列 a1,a2,a3…an, a1的逆序数就是在 a2…an 中,比 a1 小的数的数量,而 a2 的逆序数就是 a3….an 中比 ...

  6. 2016级算法第五次上机-F.ModricWang的水系法术

    1066 ModricWang的水系法术 思路 比较典型的最大流问题,需要注意的是,题目已经暗示(明示)了这里的边是双向的,在建图的时候需要加上反向边的容量值. 解决最大流问题的基本思路就是不断在残量 ...

  7. 2016级算法第五次上机-E.AlvinZH的学霸养成记IV

    1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的 ...

  8. 2016级算法第五次上机-C.Bamboo和"Coco"

    1064 Bamboo和"Coco" 分析题意 每个亡灵至少一个花瓣,相邻的亡灵中思念值高的要获得的花瓣高(思念值相等是不需要花瓣一样多的).主要考贪心思路,为了使得花瓣总量最少, ...

  9. 2016级算法第五次上机-B.Bamboo&APTX4844魔发药水

    Bamboo&APTX4844魔发药水 题意 "于是,Bamboo耐着性子,看巫师从袖子里掏出 M 瓶时光泉水和 K 粒绿色能量.每瓶时光泉水重量为 c ,生发效果为 l:每粒绿色能 ...

随机推荐

  1. ICEM-interface相关操作

    原视频下载地址: https://pan.baidu.com/s/14Tx-eYPccvhrg5wrg7gYvw 密码: 8fdp

  2. <英狼> 团队作业2--王者光耀

    队员 陶俊宇_031702113 卞永亨_031702229 唐怡_031702109 Github 吉哈---King-Shines

  3. 5、vueJs基础知识05

    vue2.0相比于1.0的变化 1.在每个组件模板中,不再支持片段代码,需要一个根元素包裹 组件中模板: 之前: <template> <h3>我是组件</h3>& ...

  4. 以前进行的程序安装创建了挂起的文件操作(SqlServer2000或SqlServer 2000 SP4补丁安装)

    在安装SqlServer 2000或者SqlServer 2000 SP4补丁时常常会出现这样的提示,从而不能进行安装,即使重新启动了计算机,也还是会有同样的提示.在网上查了一下资料,原来是注册表里记 ...

  5. python format 时间格式

    trainData['survey_time'] = pd.to_datetime(trainData['survey_time'],format = '%Y/%m/%d %H:%M') trainD ...

  6. JPA 原生SQ查询

    参考文章 https://blog.csdn.net/coding_1994/article/details/84575943 https://blog.csdn.net/m0_37776094/ar ...

  7. C前序遍历二叉树Morris Traversal算法

    首先来递归算法,简单易懂: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef ...

  8. game-hacking

    https://github.com/dsasmblr/game-hacking Cheat Engine Hacking memory Cheat engine have a feature cal ...

  9. Spark(五十一):Spark On YARN(Yarn-Cluster模式)启动流程源码分析(二)

    上篇<Spark(四十九):Spark On YARN启动流程源码分析(一)>我们讲到启动SparkContext初始化,ApplicationMaster启动资源中,讲解的内容明显不完整 ...

  10. JEECG MiniDao优劣

    Minidao 1.5.1 - 我认为这是一个不严谨的错误 - andotorg的个人空间 - OSCHINAhttps://my.oschina.net/antsdot/blog/1800832 M ...