数据结构 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. 使用Visio画UML模型

    Microsoft Office Visio“UML 模型图” 模板为创建复杂软件系统的面向对象的模型 (模型:建模系统的一种抽象表示,它从特定的视角并在某一抽象级别上指定建模系统.) 提供全面的支持 ...

  2. jquery ajax中使用jsonp的限制(转)

    http://www.cnblogs.com/dudu/archive/2012/12/04/jquery_ajax_jsonp.html jsonp 解决的是跨域 ajax 调用的问题.为什么要跨域 ...

  3. 455. Assign Cookies Add to List

    Assume you are an awesome parent and want to give your children some cookies. But, you should give e ...

  4. 3143 codevs 二叉树的序遍历

    题目描述 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 输入描述 Input Description 第一行一个整数n,表示这棵树的节点个数. 接下来n行每行2个整数L和R.第i ...

  5. C++对C语言的拓展(2)—— inline内联函数

    C语言中有宏函数的概念.宏函数的特点是内嵌到调用代码中去,避免了函数调用 的开销.但是由于宏函数的处理发生在预处理阶段,缺失了语法检测和有可能带来的语意差错. 1.内联函数基本概念 C++提供了 in ...

  6. Python 函数之lambda、map、filter和reduce

    1.lambda函数 lambda()是Python里的匿名函数,其语法如下: lambda [arg1[, arg2, ... argN]]: expression 学习条件运算时,对于简单的 if ...

  7. 机器学习:PCA(实例:MNIST数据集)

    一.数据 获取数据 import numpy as np from sklearn.datasets import fetch_mldata mnist = fetch_mldata("MN ...

  8. Task用法(2)-任务等待wait

    1.Wait 用法   默认情况下,Task 是有线程池中的异步线程执行,是否执行完成,可以通过Task的的属性IsCompleted 来判断,  如果想在子线程工作完成之后,在进行后续主线程工作可以 ...

  9. Windows_Server_2008远程桌面多用户登陆的配置方法

    开启远程桌面后,Windows Vista(或Windows 2008)下默认只支持一个administrator用户登陆,一个登录后另一个就被踢掉了,下面提供允许同一个用户名同时多个用户登录的配置方 ...

  10. java 多线程系列---JUC原子类(二)之AtomicLong原子类

    概要 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.本章以AtomicLong对基本类型的原子类进行介绍. AtomicLong ...