百练+重要逆序对归并排序,记得要有标记来减少循环扫描
来源:互联网 发布:淘宝上卖千岛片真的么 编辑:程序博客网 时间:2024/05/16 19:52
点击打开链接
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string>#include<cstring>#include<string.h>#include<math.h>#include<algorithm>#define inf 0x3f3f3f3f#define LL long longusing namespace std;int N=0;const int maxn=2e5+5;LL Arr[maxn]={0},temp[maxn]={0},sum=0;void MergeSort(LL Arr[], int left,int mid, int right){ int i=left,j=mid+1,len=right-left,index=0,flag_vis=-1; while(i<=mid&&j<=right){ if(Arr[i]>Arr[j]){ if(flag_vis!=-1){ for(int flag=flag_vis;flag<=mid;flag++){ if(Arr[flag]>2*Arr[j]){ sum+=mid-flag+1; flag_vis=flag; break; } } } else{ for(int flag=i;flag<=mid;flag++){ if(Arr[flag]>2*Arr[j]){ sum+=mid-flag+1; flag_vis=flag; break; } } } temp[index++]=Arr[j]; j++; } else { temp[index++]=Arr[i]; i++; } } if(i>mid){ while(j<=right){ temp[index++]=Arr[j]; j++; } } else{ while(i<=mid){ temp[index++]=Arr[i];i++; } } for(int k=0;k<=len;k++){ Arr[left+k]=temp[k]; }}void Merge(LL Arr[], int left, int right){ if(left<right){ int mid=(left+right)/2; Merge(Arr,left,mid); Merge(Arr,mid+1,right); MergeSort(Arr,left,mid,right); }}int main(){ while(scanf("%d",&N)){ if(N==0) break; for(int i=0;i<N;i++){ scanf("%lld",&Arr[i]); } sum=0; Merge(Arr,0,N-1); printf("%lld\n",sum); } return 0;}
阅读全文
0 0
- 百练+重要逆序对归并排序,记得要有标记来减少循环扫描
- 逆序对 归并排序
- 归并排序 & 逆序对
- 归并排序--逆序对
- 归并排序&归并排序求逆序对
- 归并排序求逆序对
- 【归并排序】【逆序对】序列
- 归并排序与逆序对
- 归并排序求逆序对
- 归并排序求逆序对~~~
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序之逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 经验误差,泛化误差
- 训练总结 12.7
- Spring Security
- 用类描述计算机中CPU速度和硬盘容量
- 数据结构试验
- 百练+重要逆序对归并排序,记得要有标记来减少循环扫描
- 小球与盒子(矩阵乘法+快速幂)
- Caffe源码:pooling_layer.cpp
- BOX 判断是否能够形成立方体
- 我的Java之旅
- pom.xml
- linux下查看系统配置参数
- 关于Linux下,文件传输与ftp以及Tomcat配置等
- 实验一 线性表的应用(2学时)