博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P1908 逆序对
阅读量:4619 次
发布时间:2019-06-09

本文共 1492 字,大约阅读时间需要 4 分钟。

 P1908 逆序对

    • 2.2K通过
    • 4.4K提交
  • 题目提供者该用户不存在
  • 标签云端
  • 难度普及/提高-
  • 时空限制1s / 128MB

 提交  讨论  题解  

最新讨论更多讨论

  • 归并排序党注意了!数组要开…
  • dalao题解看不懂。。。。
  • 数据太水!!!!!!!!!…
  • 为什么不对?
  • 数据范围有误!!!
  • 暴力20!

题目描述

猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对。知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。

输入输出格式

输入格式:

 

第一行,一个数n,表示序列中有n个数。

第二行n个数,表示给定的序列。

 

输出格式:

 

给定序列中逆序对的数目。

 

输入输出样例

输入样例#1:
65 4 2 6 3 1
输出样例#1:
11

说明

对于50%的数据,n≤2500

对于100%的数据,n≤40000。

分析:树状数组的模板题,所给的正整数大小可能会比较大,所以先离散,给排序后的数分配一个序号,然后每次添加一个数,然后进行求和,所得到的是这个数前比它小的数的个数,那么可以很容易得到比它大的数的个数,累加答案即可.

#include 
#include
#include
#include
using namespace std;int n,a[500005],re[500010];struct node{ int v, id;}t[500010];bool cmp(node a, node b){ return a.v < b.v;}void add(int x, int d){ while (x <= n) { a[x] += d; x += x & (-x); }}int sum(int x){ int cnt = 0; while (x) { cnt += a[x]; x -= x&(-x); } return cnt;}int main(){ scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &t[i].v); t[i].id = i; } sort(t + 1, t + n + 1, cmp); for (int i = 1; i <= n; i++) re[t[i].id] = i; long long ans = 0; for (int i = 1; i <= n; i++) { add(re[i], 1); ans += i - sum(re[i]); } printf("%lld", ans); return 0;}

 

转载于:https://www.cnblogs.com/zbtrs/p/7076868.html

你可能感兴趣的文章
双缓冲技术局部更新原理之派生自View
查看>>
PPAPI插件与浏览器的通信
查看>>
用 query 方法 获得xml 节点的值
查看>>
Hello,Android
查看>>
Sublime Text 3 build 3103 注册码
查看>>
删与改
查看>>
SAP 中如何寻找增强
查看>>
spi驱动无法建立spidev问题
查看>>
ANDROID开发之SQLite详解
查看>>
如何依靠代码提高网络性能
查看>>
Fedora 17 无线网卡配置笔记
查看>>
[HNOI 2001]求正整数
查看>>
plsql出现录相机后卡屏解决方法
查看>>
HDU 1004 Let the Balloon Rise
查看>>
Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses
查看>>
numpy.random.shuffle()与numpy.random.permutation()的区别
查看>>
Zookeeper要安装在奇数个节点,但是为什么?
查看>>
discuz 微社区安装记录
查看>>
[BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数
查看>>
配置的热更新
查看>>