51nod 1019 逆序数

来源:互联网 发布:网络信息许可证 编辑:程序博客网 时间:2024/05/02 01:18

归并排序,思路简单,百度一下到处都是。


计算有多少组思路如下:


对于一个已经排好的两个序列(A,B)而言,因为A中序列数字在原序列的位置都是在B之前的,所以,每次从B中取元素时,A中有多少个没有取,就说明A中这些元素都能和当前从B取的这个元素组成一对逆序数,然后统计每次从B中取元素时的A有多少没取,然后直接输出答案。


归并排序思路如下:

对于每一个序列可以尽量平分成为两个子序列,然后每个子序列也可以如此操作,然后直到不可拆分为止,从两个子序列中从小到大依次取元素(此时每个子序列都只有一个元素),然后把合并的新序列返回到原序列,这样原序列对应的这段元素就是排好序的,然后依次类推。

代码如下:(最近又改了一下代码,发现以前写的代码好难看啊,虽然现在也难看,但是勉强能入眼吧......)

#include<bits/stdc++.h>using namespace std;int n,num[50005],Count[50005],ans;void find(int S,int mid,int E){int s=S,m=mid+1,e=E,k=s;while(s<=mid && m<=e){if(num[s]<=num[m]) Count[k++]=num[s++];else {Count[k++]=num[m++];ans+=mid-s+1;}}while(s<=mid)Count[k++]=num[s++];while(m<=e)Count[k++]=num[m++];for(s=S;s<=E;s++)num[s]=Count[s];//printf("%d %d %d  %d\n",S,mid,E,ans);}void Msort(int S,int E){if(S>=E)return ;int mid=(S+E)/2;Msort(S,mid);Msort(mid+1,E);find(S,mid,E);}int main(){ans=0;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&num[i]);}Msort(1,n);printf("%d\n",ans);}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 订机票时护照号错了怎么办 请问网上不小心点了扣话费了怎么办 不小心被中国移动扣了话费怎么办 京东买东西已经付款了说无货怎么办 不小心提交了两次中信信用卡怎么办 淘宝买东西扣了银行卡两次钱怎么办 拼多多同一个订单支付了两次怎么办 京东手机号服务密码忘记了怎么办 京东买的东西转手给别人保修怎么办 改了无线网密码还是上不去网怎么办 买的京东e卡丢了怎么办 已认证未抵扣的发票发生退货怎么办 办的消费卡不给退怎么办 银行卡密码忘了手机号也换了怎么办 公务卡在当当购物的刷卡单怎么办 杭州市网签提示住宅均价异常怎么办 吃鸡账号没有绑定手机就买了怎么办 微信绑定的银行卡密码错误怎么办 淘宝单张券已领取达上限怎么办 去办公室给领导送礼总有人怎么办 招行信用卡临时额度到期后怎么办 中银e令不想用了怎么办 中银e令密码忘了怎么办 银行卡预留手机号改了支付宝怎么办 手机一直收到支付验证码短信怎么办 微信绑定银行卡手机号码换了怎么办 银行卡网银登录输错密码锁了怎么办 中行信用卡主付卡的付卡怎么办停 在苏宁网购的移动空调要退货怎么办 单位发的购物卡掉了怎么办 支付宝ofo退押金后余额怎么办 e招贷分期多还了怎么办 别人用我的手机号贷款不还怎么办 电脑文件夹怎么设密码忘记了怎么办 苹果手机id有分机和主机怎么办 绝地求生号被盗了邮箱被改了怎么办 微信邮箱怎么接收不到验证码怎么办 要申请一个特定的qq邮箱号怎么办 中银e贷额度为0怎么办 中银e贷被冻结了怎么办 中国银行e贷款填错了被拒怎么办