数据结构 nxd(顺序对)

问题描述

  给定 n 个数 a1,a2,...,an,求满足条件的(i,j)数量: i<j 且 a[i]<a[j]

★数据输入
输入第一行为一个正整数 n。
第二行为 n 个数,第 i 个代表 ai。
对于 90%的数据, 1<=n<=6666;
对于 100%的数据, 1<=n<=100086, 0<=ai<=1000,000,000;

★数据输出
输出满足条件的(i, j) 的数量。

输入示例 输出示例
5
9 1 5 2 2
3
输入示例 输出示例
7
4 3 1 5 5 5 2
10

解题思路

  解法1:

    插入排序,二分查找

    c++可用vector + lower_bound实现

    注意 100086^2 = 100亿+,结果应用__int64  (long long int) 存

  解法2:

    手写归并排序,从大到小排列,统计数据左移次数

code

解法1

 #include <stdio.h>
#include <iostream> class A
{
public:
A(int _maxsize)
:ans(),size()
{
arr = new int[_maxsize+];
}
~A()
{
delete arr;
}
void insert(int n)
{
int pos = findInsertPos(n);
ans += pos;
for(i=size;i>pos;i--)
{
arr[i] = arr[i-];
}
arr[pos] = n;
size++;
}
__int64 getAns()
{
return ans;
}
void _disAll()
{
for(i=;i<size;i++)
printf("%d ",arr[i]);
printf("\n");
}
private:
int findInsertPos(int n)
{
if(size==)
{
return ;
}
else if(n <= arr[])
{
return ;
}
else if(n>arr[size-])
{
return size;
}
else
{
int l=,r=size-,mid=(l+r)/;
for( ; l<r ; mid=(l+r)/)
{
if(arr[mid]<n && n<=arr[mid+])
{
return mid+;
}
else if(n>arr[mid])
{
l=mid;
}
else// if(arr[mid]>n)
{
r=mid;
}
}
// printf("error! no found\n");
return ;
}
}
private:
__int64 ans;
int *arr;
int size;
int i,j;
}; int main()
{
// freopen("in.txt","r",stdin);
int n,i,buf;
scanf("%d",&n);
A obj(n);
for(i=;i<n;i++)
{
scanf("%d",&buf);
obj.insert(buf);
// obj._disAll();//tester
}
printf("%I64d",obj.getAns()); return ;
}

解法2

 #include <stdio.h>
#include <stdlib.h> __int64 ans=;
int *arr=NULL,*buf=NULL;
int len=; void init()
{
ans=;
int i;
scanf("%d",&len);
arr = (int *)malloc(sizeof(int)*len);
buf = (int *)malloc(sizeof(int)*len);
for(i=;i<len;i++)
scanf("%d",arr+i); }
void disAll();
void mergeSort(int *p, int l, int r)//归并 从大到小
{
if(l>=r) return;
if(r==l+)
{
if(p[l]<p[r])
{
p[l]^=p[r];
p[r]^=p[l];
p[l]^=p[r];
ans++;//
}
}
else
{
int m = (l+r)/;
mergeSort(p,l,m);
mergeSort(p,m+,r); int i,j,k;
for(i=l;i<=r;i++)
buf[i]=p[i];
for(k=l,i=l,j=m+;k<=r;)
{
if(i>m)
p[k++] = buf[j++];
else if(j>r)
p[k++] = buf[i++];
else if(buf[i]>=buf[j])
p[k++] = buf[i++];
else// if(buf[j]>buf[i])
{
ans+=m+-i;//
p[k++] = buf[j++];
}
}
}
} void deleteAll()
{
if(arr) free(arr);
if(buf) free(buf);
} void disAns()
{
printf("%I64d",ans);
} void _disAll()
{
for(int i=;i<len;i++)
printf("%d ",arr[i]);
printf("\n");
} int main()
{
init();
mergeSort(arr,,len-);
disAns(); deleteAll();
return ;
}

数据结构 nxd(顺序对)的更多相关文章

  1. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)

    基础数据结构——顺序表(2) Time Limit: 1000 MS    Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...

  2. [Python] 数据结构--实现顺序表、链表、栈和队列

    说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...

  3. cb03a_c++_数据结构_顺序容器_STL_stack

    /*cb03a_c++_数据结构_顺序容器_STL_stack堆栈:LIFO--Last In First Out后进先出,用于系统程序设计自适应容器(容器适配器),不是独立的容器,是一个适配器栈适配 ...

  4. cb02a_c++_数据结构_顺序容器_STL_list类_双向链表

    /*cb02a_c++_数据结构_顺序容器_STL_list类_双向链表实例化std::list对象在list开头插入元素在list末尾插入元素在list中间插入元素,插入时间恒定,非常快.数组:中间 ...

  5. cb01a_c++_数据结构_顺序容器_STL_deque类

    /*cb01a_c++_数据结构_顺序容器_STL_deque类deque是一个动态数组,比vector更加灵活.两者都属于动态数组deque与vector非常类似deque可以在数组开头和末尾插入和 ...

  6. C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...

  7. 数据结构 - 静态顺序线性表的实行(C语言)

    数据结构 - 静态顺序线性表的实行(C语言) 1 获取元素操作 对于线性表的顺序存储结构来说,如果我们要实现GetElem操作,即将线性表L中的第i个位置元素值返回,其实是非常简单的. 只要i的数值在 ...

  8. [数据结构]C#顺序表的实现

    在数据结构的学习当中,想必C++可能是大家接触最多的入门语言了 但是C#的数据结构却很少看到,今天我写了一个C#顺序表的顺序存储结构 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是 ...

  9. 【PHP数据结构】顺序表(数组)的相关逻辑操作

    在定义好了物理结构,也就是存储结构之后,我们就需要对这个存储结构进行一系列的逻辑操作.在这里,我们就从顺序表入手,因为这个结构非常简单,就是我们最常用的数组.那么针对数组,我们通常都会有哪些操作呢? ...

随机推荐

  1. bzoj3163 Eden的新背包问题

    多重背包,$q$ 次询问,每次问删一个物品之后花费 $x$ 能装多少物品 $n \leq 3000, x \leq 1000, q \leq 300000$ sol: 网上有很多假做法 正解应该是考虑 ...

  2. WC2019 I 君的商店

    交互题 一个 01 序列,告诉你其中 1 有奇数个还是偶数个,每次可以给定两个集合 $A$,$B$,系统会告诉你 $A \leq B$ 或者 $B \leq A$ 求序列 交互次数要求 $5n + O ...

  3. Gym - 100623J Just Too Lucky (数位dp)

    给定n∈[1,1e12],求1到n的所有整数中,各位数字之和能整除它本身的数的个数. 这道题与UVA-11361类似,假如设dp[u][lim][m1][m2]为枚举到第u位(从低到高数),是否受限, ...

  4. 《Javascript高级程序设计》阅读记录(六):第六章 下

    这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 <Javascript ...

  5. ubuntu lts install licode tag pre-v5.4

    1. Requirements Ubuntu 14.04 LTS 2. Clone Licode codeYou first need to clone our code from github.Yo ...

  6. 寻找php.ini之旅

    /usr/local/php-fpm/lib/php.ini 可以通过phpinfo()来查看 https://www.cnblogs.com/ChineseMoonGod/p/6474772.htm ...

  7. 在CentOS上安装Java开发环境:使用yum安装jdk

    请参考百度经验:http://jingyan.baidu.com/article/4853e1e51d0c101909f72607.html 如果您阅读过此文章有所收获,请为我顶一个,如果文章中有错误 ...

  8. PHP5之前的构造函数与PHP5之后的构造函数的区别

    在PHP5以前的版本中,构造函数的名称必须与类名相同,这种方法在PHP5中仍然可以使用,但现在已经很少有人用了. PHP5以及之后的版本,构造函数用__construct()方法来声明,这样做的好处是 ...

  9. UE4材质初探

    转自:http://www.unrealchina.net/portal.php?mod=view&aid=233 UE4的材质表面上看起来很简单,可是到了用的时候却总是没有办法实现好的效果. ...

  10. SqlServer——存储过程(未完工)

    http://www.cnblogs.com/blsong/archive/2009/11/30/1613534.html http://blog.csdn.net/lenotang/article/ ...