数据结构 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. 基于Python语言使用RabbitMQ消息队列(四)

    路由 在上一节我们构建了一个简单的日志系统.我们能够广播消息给很多接收者. 在本节我们将给它添加一些特性——我们让它只订阅所有消息的子集.例如,我们只把严重错误(critical error)导入到日 ...

  2. 用TCP穿透NAT(TCP打洞)的实现

    目录 TCP穿透原理 程序思路 声明 上代码 运行示例 1. TCP穿透原理: 我们假设在两个不同的局域网后面分别有2台客户机A和 B,AB所在的局域网都分别通过一个路由器接入互联网.互联网上有一台服 ...

  3. 如何找回未保存过的 Excel 文件?

    如何找回未保存过的 Excel 文件? 同事做了一个文件,未保存直接关闭,正常是找不回来的. 但是 Excel 有一个强大的自动保存功能,对没有保存的文件也可以找回.

  4. BZOJ3403:[USACO2009OPEN]Cow Line

    浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...

  5. IEEE1588精密网络同步协议(PTP)

    1  引言 以太网技术由于其开放性好.价格低廉和使用方便等特点,已经广泛应用于电信级别的网络中,以太网的数据传输速度也从早期的10M提高到100M,GE,10GE.40GE,100GE正式产品也于20 ...

  6. HDU1560(迭代加深搜索)

    DNA sequence Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  7. Java-API-Package:org.springframework.beans.factory.annotation

    ylbtech-Java-API-Package:org.springframework.beans.factory.annotation 1.返回顶部 1. @NonNullApi @NonNull ...

  8. 关于64位操作系统使用C#访问注册表失败的问题

    通过C#的注册表类 Registry.GetValue 进行访问时,其返回值一直为空.然后认真检查检查再检查了注册表路径,发现路径没有一点问题,不说废话,上代码: if (Registry.GetVa ...

  9. Excel开发学习笔记:界面交互与控件的布局

    遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. , ).value ...

  10. Python模块之: ConfigParser 配置文件读取

    Python模块之: ConfigParser 配置文件读取   ConfigParser用于读写类似INI文件的配置文件,配置文件的内容可组织为组,还支持多个选项值(option-value)类型. ...