数据结构 nxd(顺序对)
数据结构 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(顺序对)的更多相关文章
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...
- [Python] 数据结构--实现顺序表、链表、栈和队列
说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...
- cb03a_c++_数据结构_顺序容器_STL_stack
/*cb03a_c++_数据结构_顺序容器_STL_stack堆栈:LIFO--Last In First Out后进先出,用于系统程序设计自适应容器(容器适配器),不是独立的容器,是一个适配器栈适配 ...
- cb02a_c++_数据结构_顺序容器_STL_list类_双向链表
/*cb02a_c++_数据结构_顺序容器_STL_list类_双向链表实例化std::list对象在list开头插入元素在list末尾插入元素在list中间插入元素,插入时间恒定,非常快.数组:中间 ...
- cb01a_c++_数据结构_顺序容器_STL_deque类
/*cb01a_c++_数据结构_顺序容器_STL_deque类deque是一个动态数组,比vector更加灵活.两者都属于动态数组deque与vector非常类似deque可以在数组开头和末尾插入和 ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- 数据结构 - 静态顺序线性表的实行(C语言)
数据结构 - 静态顺序线性表的实行(C语言) 1 获取元素操作 对于线性表的顺序存储结构来说,如果我们要实现GetElem操作,即将线性表L中的第i个位置元素值返回,其实是非常简单的. 只要i的数值在 ...
- [数据结构]C#顺序表的实现
在数据结构的学习当中,想必C++可能是大家接触最多的入门语言了 但是C#的数据结构却很少看到,今天我写了一个C#顺序表的顺序存储结构 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是 ...
- 【PHP数据结构】顺序表(数组)的相关逻辑操作
在定义好了物理结构,也就是存储结构之后,我们就需要对这个存储结构进行一系列的逻辑操作.在这里,我们就从顺序表入手,因为这个结构非常简单,就是我们最常用的数组.那么针对数组,我们通常都会有哪些操作呢? ...
随机推荐
- [转载] 最简单的基于FFmpeg的AVDevice例子(读取摄像头)
=====================================================最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDev ...
- vector的内存分配机制分析
该程序初步演示了我对vector在分配内存的时候的理解.可能有误差,随着理解的改变,改代码可以被修改. /* 功能说明: vector的内存分配机制分析. 代码说明: vector所管理的内存地址是连 ...
- 欧拉函数 and 大数欧拉 (初步)
前两天总结了素数筛法,其中就有Eular筛法.现在他又来了→→ φ(n),一般被称为欧拉函数.其定义为:小于n的正整数中与n互质的数的个数. 毕竟是伟大的数学家,所以以他名字命名的东西很多辣. 对于φ ...
- ACM学习历程—SNNUOJ1213 加油站问题(动态规划 || 数学)
题目链接:http://219.244.176.199/JudgeOnline/problem.php?id=1213 这是这次微软实习面试的一道题,当时只相出了一个2n的做法,面试官让我优化成n的做 ...
- Js里头的对象字面量
JavaScript 对象字面量 在编程语言中,字面量是一种表示值的记法.例如,"Hello, World!" 在许多语言中都表示一个字符串字面量(string literal ) ...
- VS2005环境下的DLL应用
VS2005环境下的DLL应用 作者:一点一滴的Beer http://beer.cnblogs.com/ 以前写过一篇题为<VC++的DLL应用(含Demo演示)>的文章,当时是刚开始接 ...
- bzoj 1997 [Hnoi2010]Planar——2-SAT+平面图的一个定理
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1997 平面图的一个定理:若边数大于(3*点数-6),则该图不是平面图. 然后就可以2-SAT ...
- [C++] 递归之全排列问题、半数集
一.递归的定义 一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个原问题相似的规模较小的问题来求解. 二.用递归求解问题的主要步骤 1.找出相似性 ...
- Spring Boot发布和调用RESTful web service
Spring Boot可以非常简单的发布和调用RESTful web service,下面参考官方指导体验一下 1.首先访问 http://start.spring.io/ 生成Spring Boot ...
- mybatis sql中的条件语句
1.mybatis判断是否为空或null <if test="type!=null and type!=''"> AND type = #{type} </if& ...