给出一列数a1,a2,a3....an,求它们的逆序对数,即有多少个有序对(i,j) 使得iaj,n高达10的6次方
//归并排序
//#include<stdio.h>
//#include<string.h>
//#include<algorithm>
//#include<iostream>
//using namespace std;
//
//int n,m;
//int a[10],b[10];
//
//void merge_sort(int* A,int x,int y,int* T)
//{
// if(y-x>1)
// {
// int m=(y-x)/2+x;
// int p=x,q=m,i=x;
// merge_sort(A,x,m,T);
// merge_sort(A,m,y,T);
// while(p<m||q<y)
// {
// if(q>=y||p<m&&A[p]<=A[q]) T[i++]=A[p++];//一石二鸟,控制左边和右边
// else T[i++]=A[q++];
// }
// for(i=x; i<y; i++) A[i]=T[i];
// }
//}
//
//int main()
//{
// scanf("%d",&n);
// while(n--)
// {
// int i,j;
// memset(b,0,sizeof(b));
// scanf("%d",&m);
// for(i=0; i<m; i++)
// scanf("%d",&a[i]);
// merge_sort(a,0,m,b);
// for(i=0; i<m; i++)
// printf("%d ",a[i]);
// printf("\n");
// }
// return 0;
//}
//给出一列数a1,a2,a3....an,求它们的逆序对数,即有多少个有序对(i,j)
//使得i<j,ai>aj,n高达10的6次方
//思路:
//和归并排序一样,划分和递归求解都好办,关键在于合并;如何求出i在左边
//而j在右边的逆序对数呢?统计的常见技巧是"分类",我们按照j的不同把这些
//"跨越两边"的逆序对进行分类;只要对于右边的每个j,统计左边比它大的元素个数f(j)
//则所有f(j)的和就是答案
//幸运的是归并排序可以帮我们"顺便"完成f(j)的计算;由于合并操作是从小到大进行的
//当右边的A[j]复制到T中时,左边还没来得及辅助到T的那些数就是左边所有比A[j]大的数
//此时在累加器中加上左边元素个数m-p即可(左边所剩的元素在区间[p,m)中,因此个数是m-p)
//换句话说就是把"else T[i++]=A[q++]"改成"else{T[i++]=A[q++];cnt+=m-p;".注意cnt要清零
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int n,m;
int cnt;
int a[10],b[10];
void merge_sort(int* A,int x,int y,int* T)
{
cnt=0;
if(y-x>1)
{
int m=(y-x)/2+x;
int p=x,q=m,i=x;
merge_sort(A,x,m,T);
merge_sort(A,m,y,T);
while(p<m||q<y)
{
if(q>=y||p<m&&A[p]<=A[q]) T[i++]=A[p++];
else
{
T[i++]=A[q++];
cnt+=m-p;
}
}
for(i=x; i<y; i++) A[i]=T[i];
}
}
int main()
{
scanf("%d",&n);
while(n--)
{
int i;
memset(b,0,sizeof(b));
scanf("%d",&m);
for(i=0; i<m; i++)
scanf("%d",&a[i]);
merge_sort(a,0,m,b);
for(i=0; i<m; i++)
printf("%d ",a[i]);
printf("\n");
printf("%d\n",cnt);
}
return 0;
}
给出一列数a1,a2,a3....an,求它们的逆序对数,即有多少个有序对(i,j) 使得iaj,n高达10的6次方的更多相关文章
- //给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和
//给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和 # include<stdio.h> void main() { ,sum1; ]={,- ...
- 如何生成a1,a2,a3,a4这样的变量名
var num=6; function Girl(beautifulScore){ this.beautifulScore=beautifulScore; } var girls=[]; for (v ...
- 给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数。
给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数. #include <iostream> ...
- 已知一个序列A1.A2….An,给你一个整数K,找到满足所有Ai+Aj>=k的数对(i,j)的个数
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 100010 /* 已知一个序 ...
- 有a1,a2,a3,a4,四个数组,四个数组重新组合成一个数组(A),间隔是10个元素
好久没折腾Py了,这是去年年初2019.3月发在Q中的一个记录,因不从事这个,并且被在工厂耽误10几年,所以很少写Blog在这里,感觉这里比较正式,而在Q中只是随意性的记载, 但发布图片总是需要另外再 ...
- 用VBA计算WPS 表格ET EXCEL中的行数和列数的多重方法
用VBA计算WPS 表格ET EXCEL中的行数和列数 每种方法中上面的是Excel的行数,下面的是Excel的列数. 方法1: ActiveSheet.UsedRange.Rows.Count Ac ...
- VBA取得EXCEL表格中的行数和列数
VBA取得EXCEL表格中的行数和列数 初学EXCEL宏的童鞋,总是很想知道表格中含有数据的行数和列数,尤其是行数和列数不确定的情况下.这样可以避免很多的错误,并且可以提高效率.但每次用到的时候到网上 ...
- C# 得到EXCEL表格中的有效行数和列数
每种方法中上面的是Excel的行数,下面的是Excel的列数.方法七:经过加工修改已经可以读出来的是有效数据行 using Excel = Microsoft.Office.Interop.Excel ...
- Office EXCEL VBA如何取得EXCEL中的行数和列数
VBA取得EXCEL表格中的行数和列数 请注意不要使用Columus等关键字作为变量,例如"Columus = ActiveSheet.UsedRange.Columns.Count&quo ...
随机推荐
- 重构改善既有代码设计--重构手法09:Substitute Algorithm (替换算法)
你想要把某个算法替换为另一个更清晰地算法.将函数本体替换为另一个算法. string FoundPerson(string[] people) { for (int i = 0; i < peo ...
- Redis-1-Redis的安装
Redis 什么是Redis? redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库. 安装Redis: windows下如何安装? 官方网址:ht ...
- 【BZOJ】2154: Crash的数字表格 莫比乌斯反演
[题意]给定n,m,求Σlcm(i,j),1<=i<=n,1<=j<=m,n,m<=10^7. [算法]数论(莫比乌斯反演) [题解] $$ans=\sum_{i\leq ...
- HDU 1754 I Hate It (线段树)
题目链接 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老 ...
- JSTL标签库笔记
1. 概述 JSTL(Jsp Standard Tag Library)即JSP标准标签库,只能运行在支持JSP1.2↑和Servlet2.3↑规范的容器上. 通常情况下我们在编写JSP页面的时候,在 ...
- Django之Form组件验证
今天来谈谈Django的Form组件操作 Django中的Form一般有两种功能: ·输入html ·验证用户输入 Form验证流程 ·定义规则(是一个类) ·前端把数据提交过来 ·匹配规则 · ...
- cookie知识点概述
cookie是什么 这个讲起来很简单,了解http的同学,肯定知道,http是一个不保存状态的协议,什么叫不保存状态,就是一个服务器是不清楚是不是同一个浏览器在访问他,在cookie之前,有另外的技术 ...
- 如何通过掩码计算可用的IP数量
假设掩码是28,28也就是28个1.本身掩码是255.255.255.255那么转换成二进制也就是 11111111,11111111,11111111,11111111 那么28个1也就是: 111 ...
- 64_t4
texlive-hardwrap-svn21396.0.2-33.fc26.2.noarch.rpm 24-May-2017 15:41 35930 texlive-harmony-doc-svn15 ...
- geoip 扩展包根据ip定位详情
教程:https://laravel-china.org/courses/laravel-package/2024/get-the-corresponding-geo-location-informa ...